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,
...
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。
是的,正如@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
根据定义,主键永远不能为 Null。主键目的是唯一标识记录。主键是唯一指定行的列的组合。
Null 值表示缺少值。即使两条记录在同一列中具有 NULL,列值也不被视为相等。
在大多数 DBMS 中,因为它是一个主键(并且定义是它在表中必须是唯一的),所以它肯定不能为空。