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

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

タイトルとして、PersonIdに "not null"を指定する必要がありますか?それともプライマリキーに設定した場合、デフォルトで自動的にnullになりませんか?プライマリキーに "not null"を指定する必要がありますか? Oracle/SQL

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

あなたはこれを簡単にテストすることができあなた自身。あなたはドキュメントを読むことさえできます! –

+0

主キーはNOT NULLである必要があります。ほとんどの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は、私が実証したように、主キーがテーブル宣言でnot nullとして指定される必要はありません。私はOracleが問題のRDBMSであると仮定しました。これはOPが質問にタグ付けしたものですから。 – eaolson

2

ほとんどのDBMSでは、主キー(およびその定義はテーブル内で一意でなければならない)であるため、ほとんどの場合、必ずnullにすることはできません。

2

定義による主キーは決してNullにはなりません。 主な目的は、レコードを一意に識別することです。 主キーは、行を一意に指定する列の組み合わせです。

ヌル値は値の欠如を表します。 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は、NOT NULL NULL可能とcol2です。 NOT NULL主キーの変更両方の列を:あなたは無効にするか、主キーを削除した場合、両方の列が元の状態に戻す、CO1は再び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 

を次のようになります。

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 
関連する問題