【问题标题】:Do we need to specify "not null" for primary key? Oracle/SQL [closed]我们需要为主键指定“not null”吗?甲骨文/SQL [关闭]
【发布时间】:2012-12-02 00:56:26
【问题描述】:
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,
...

【问题讨论】:

  • 您可以自己轻松地进行测试。你甚至可以阅读文档!
  • 主键必须不为空。近 10 年没有使用它了,但我相信 Oracle 需要明确声明,就像大多数其他 RDBMS 一样

标签: sql oracle


【解决方案1】:
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。

【讨论】:

  • 很好的演示——谢谢。
  • 这只是表明这个特定的 RDBMS 不需要它,事实证明其他一些(DB2 和 Oracle)需要它,并为上面的 col1 给出错误。
  • Oracle 不要求在表声明中将主键指定为非空,正如我所演示的。我假设 Oracle 是有问题的 RDBMS,因为这就是 OP 将问题标记为的内容。
【解决方案2】:

是的,正如@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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-14
        • 2013-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多