這個問題是我一直都在關注的問題。
11G關於這個問題已經有了改善,到了12C更是多了一些新特性
12C關於這方面是在11G新特性上進行添加的。
11G中添加一列並設置默認值,不會對表中實際數據做更改,而是通過對數據字典中做標記
我們查詢的時候,會對新列做一個類似nvl()之類的操作,如果是null,則返回默認的數值。
但是,看如下語句
SQL> alter table t add MrDai number default 10000 not null; Table altered. Elapsed: 00:00:00.34
如果不明白該特性,很容易以為有了特性,而貿然添加,造成非常嚴重的事故。
而12C中,對這一特性再次做出了加強,我們這裡可以不用設置not null,極大減少了可能的誤操作
看如下實驗過程
創建表t,其中100多萬行數據。
SQL> select count(*) from t; COUNT(*) ---------- 1454256
SQL> alter table t add MrDai1 number default 10000; Table altered. Elapsed: 00:00:00.03
在設置完成以後,如果是新插入的行,在默認值列,會將數據真正的插入到行