我想爲alter key(NOT NULL + UNIQUE)創建輪廓約束,但我認爲NOT NULL約束不能放在outline中,因此,我想我必須選擇:NOT NULL約束與CHECK之間的區別(attr不爲空)
- 綱要約束:
CHECK(attr IS NOT NULL)
- 在在線約束
NOT NULL
+輪廓約束UNIQUE(attr)
有沒有設置在線約束有什麼區別3210添加到列並添加約束CHECK (column IS NOT NULL)
?
預先感謝
我想爲alter key(NOT NULL + UNIQUE)創建輪廓約束,但我認爲NOT NULL約束不能放在outline中,因此,我想我必須選擇:NOT NULL約束與CHECK之間的區別(attr不爲空)
CHECK(attr IS NOT NULL)
NOT NULL
+輪廓約束UNIQUE(attr)
有沒有設置在線約束有什麼區別3210添加到列並添加約束CHECK (column IS NOT NULL)
?
預先感謝
定義列NOT NULL
是首選的方法。這將在DBA_TAB_COLS
,ALL_TAB_COLS
和USER_TAB_COLS
中指示數據字典視圖,例如該列不是NULLABLE
。這也將是傳統方法,因此未來的開發人員更可能期望NOT NULL
約束在不能爲NULL
的列上定義。
正如你可以定義UNIQUE
約束與NOT NULL
限制一起,而不是創建PRIMARY KEY
限制,你可以定義CHECK
的限制,而不是NOT NULL
約束。從功能的角度來看,兩種方法都將以相同的方式工作。但數據字典視圖將以不同的方式顯示這些方法,因此依賴於數據字典的工具可能會略有不同。而傳統方法更有可能成爲未來開發人員將會看到並期望的東西,而不是被驚訝。
還有就是甲骨文頁面在這裏的一些信息: http://docs.oracle.com/cd/B14117_01/appdev.101/b10795/adfns_co.htm#1006606
Oracle說: 「爲了方便使用,你應該總是選擇定義的,而不是CHECK約束NOT NULL完整性約束,與IS NOT NULL條件。」
是的,有一個顯着的區別 - 優化器對待它們的方式不同。通常,從這個角度來看,列級別的NOT NULL是可取的(可能導致更好的執行計劃)。
順便說一句,對於Jeffrey Kemp評論「NOT NULL是唯一不需要知道約束名稱以便刪除的約束類型」 - 這種說法是錯誤的。主鍵可能在不知道其名稱的情況下被丟棄,例如,
create table x(xx number primary key, yy number);
alter table x drop primary key;
alter table x modify xx unique;
alter table x drop unique(xx);
alter table x add unique(xx,yy);
alter table x drop unique(xx,yy);
只是有點相關的瑣事︰NOT NULL是唯一的約束類型,你不需要知道約束名稱以刪除。 – 2012-03-11 14:41:10