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

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

Jako tytuł, czy muszę podać "nie puste" dla PersonId? Lub jeśli ustawię go na klucz podstawowy, domyślnie nie jest on domyślny?Czy musimy podać "nie puste" dla klucza podstawowego? Oracle/SQL

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

można łatwo to sprawdzić siebie. Możesz nawet przeczytać dokumentację! –

+0

Klucz podstawowy jest wymagany, aby NIE mieć wartości NULL. Nie używałem tego od prawie 10 lat, ale wierzę, że Oracle wymaga wyraźnej deklaracji, ponieważ większość innych RDBMS robi –

Odpowiedz

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   

Tak, nie, nie trzeba określać kolumn klucza głównego jako NOT NULL.

+0

Ładna demonstracja - dziękuję. –

+0

To pokazuje, że ten konkretny RDBMS tego nie wymaga, okazuje się, że niektóre inne (DB2 i Oracle) robią i dają błąd dla "col1" powyżej. –

+0

Oracle nie wymaga, aby klucze podstawowe były określone w deklaracji tabeli jako nie puste, co zademonstrowałem. Zakładałem, że Oracle jest RDBMS, o którym mowa, ponieważ to właśnie OP oznaczało pytania jako. – eaolson

2

W większości DBMS, ponieważ jest to klucz podstawowy (i definicji jest to, że musi on być unikalny w tabeli), to z pewnością nie może być null.

2

Klucz podstawowy z definicji nigdy nie może mieć wartości Null. Podstawowym kluczowym celem jest unikalna identyfikacja rekordów. Klucz podstawowy jest kombinacją kolumn, które jednoznacznie określają wiersz.

Wartość pusta oznacza brak wartości. Nawet jeśli dwa rekordy mają wartość NULL w tej samej kolumnie, wartości kolumn nie są uznawane za równe.

6

Tak, jak powiedział @eaolson, nie trzeba podawać NOT NULL dla kolumn klucza podstawowego, są one ustawiane automatycznie na NOT NULL.

Jednak Oracle śledzi, że nie określił wyraźnie NOT NULL w przypadku, gdy klucz podstawowy jest wyłączona lub później spadł na:

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 

Zgodnie z oczekiwaniami, col1 jest pustych i col2 NOT NULL. Klucz podstawowy zmienia obie kolumny 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 

Jeśli wyłączyć lub usunąć klucz podstawowy, obie kolumny przywrócić do stanu pierwotnego, CO1 staje się ponownie pustych:

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 
Powiązane problemy