2012-03-11 53 views
2

我想爲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)

預先感謝

+1

只是有點相關的瑣事︰NOT NULL是唯一的約束類型,你不需要知道約束名稱以刪除。 – 2012-03-11 14:41:10

回答

5

定義列NOT NULL是首選的方法。這將在DBA_TAB_COLS,ALL_TAB_COLSUSER_TAB_COLS中指示數據字典視圖,例如該列不是NULLABLE。這也將是傳統方法,因此未來的開發人員更可能期望NOT NULL約束在不能爲NULL的列上定義。

正如你可以定義UNIQUE約束與NOT NULL限制一起,而不是創建PRIMARY KEY限制,你可以定義CHECK的限制,而不是NOT NULL約束。從功能的角度來看,兩種方法都將以相同的方式工作。但數據字典視圖將以不同的方式顯示這些方法,因此依賴於數據字典的工具可能會略有不同。而傳統方法更有可能成爲未來開發人員將會看到並期望的東西,而不是被驚訝。

1

是的,有一個顯着的區別 - 優化器對待它們的方式不同。通常,從這個角度來看,列級別的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);