2012-12-02 68 views
25
CREATE TABLE Person(
    PersonId NUM(20), 
    ... 
    ) 

ALTER TABLE Person 
ADD(CONSTRAINT personpk PRIMARY KEY(PersonId)) 

作爲標題,我是否需要爲PersonId指定「not null」?或者,如果我將它設置爲主鍵,它默認情況下會自動不爲空?我們是否需要爲主鍵指定「not null」? Oracle/SQL

e.g: 
CREATE TABLE Person(
PersonId NUM(20) NOT NULL, 
... 
+0

你可以很容易檢驗這個你自己。你甚至可以閱讀文檔! –

+0

主鍵必須是NOT NULL。在近10年內沒有使用它,但我相信Oracle需要明確的聲明,因爲大多數其他RDBMS可以做 –

回答

26
create table mytable (
    col1 number primary key, 
    col2 number, 
    col3 number not null 
); 

table MYTABLE created. 

select table_name, column_name, nullable 
from user_tab_cols where table_name = 'MYTABLE'; 

TABLE_NAME      COLUMN_NAME     NULLABLE 
------------------------------ ------------------------------ -------- 
MYTABLE      COL1       N   
MYTABLE      COL2       Y   
MYTABLE      COL3       N   

因此,不需要將主鍵列指定爲NOT NULL。

+0

很好的演示 - 謝謝。 –

+0

這只是表明這個特定的RDBMS不需要它,其他一些人(DB2和Oracle)也這樣做,並給出了上面的col1錯誤。 –

+0

正如我演示的那樣,Oracle不要求在表聲明中將主鍵指定爲非空值。我認爲Oracle是有問題的RDBMS,因爲這是OP將問題標記爲。 – eaolson

2

在大多數DBMS中,由於其主鍵(且其定義必須在表內唯一),因此它肯定不能爲空。

2

根據定義,主鍵不能爲空。主要目的是唯一識別記錄。 主鍵是唯一指定行的列組合。

空值代表缺乏價值。即使兩個記錄在同一列中有NULL,列值也不會相等。

6

是的,正如@eaolson所說的,您不需要爲主鍵列指定NOT NULL,它們會自動設置爲NOT NULL。

但是,Oracle會跟蹤你沒有的情況下,指定NOT NULL明確的主鍵被禁用或刪除以後:

create table mytable (
    col1 number, 
    col2 number not null 
); 

select table_name, column_name, nullable 
    from user_tab_columns where table_name = 'MYTABLE'; 

TABLE_NAME COLUMN_NAME NULLABLE 
------------ ------------ --------- 
MYTABLE  COL1   Y 
MYTABLE  COL2   N 

正如預期的那樣,COL1可爲空和COL2 NOT NULL。主鍵改變兩列,將NOT NULL:

alter table mytable add primary key (col1, col2); 

select table_name, column_name, nullable 
    from user_tab_columns where table_name = 'MYTABLE'; 

TABLE_NAME COLUMN_NAME NULLABLE 
------------ ------------ --------- 
MYTABLE  COL1   N 
MYTABLE  COL2   N 

如果禁用或刪除主鍵,兩列恢復到原來的狀態,CO1再次爲空的就變成了:

alter table mytable disable primary key; 

select table_name, column_name, nullable 
    from user_tab_columns where table_name = 'MYTABLE'; 

TABLE_NAME COLUMN_NAME NULLABLE 
------------ ------------ --------- 
MYTABLE  COL1   Y 
MYTABLE  COL2   N 
相關問題