49
CREATE TABLE Person(
    PersonId NUM(20),
    ...
    )

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

作为标题,我是否需要为 PersonId 指定“not null”?或者如果我将它设置为主键,默认情况下它自动不为空?

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

4 回答 4

51
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。

于 2012-12-02T01:02:41.743 回答
21

是的,正如@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 不是 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
于 2012-12-02T15:07:57.793 回答
3

根据定义,主键永远不能为 Null。主键目的是唯一标识记录。主键是唯一指定行的列的组合。

Null 值表示缺少值。即使两条记录在同一列中具有 NULL,列值也不被视为相等。

于 2012-12-02T01:14:08.503 回答
2

在大多数 DBMS 中,因为它是一个主键(并且定义是它在表中必须是唯一的),所以它肯定不能为空。

于 2012-12-02T01:00:13.687 回答