【问题标题】:Primary key not null主键不为空
【发布时间】:2015-11-30 22:42:10
【问题描述】:

我正在做一个 Sql 作业,我需要在其中创建几个表。作业要求:

确保为每个表的 PK 定义 NOT NULL 约束

我不明白。当我们定义一个key为Primary Key的时候,为什么要和它分开写NOT NULL呢?将键定义为PRIMARY KEY 本身不是意味着不为空且唯一吗?

请解释一下!

编辑(从下方复制):

CREATE TABLE Faculty(
    FacNo char(11) not null,
    FacFirstName varchar(30) not null,
    FacLastName varchar(30) not null,
    FacCity varchar(30) not null,
    FacState char(2) not null,
    FacZipCode char(10) not null,
    FacRank char(4),
    FacHireDate date,
    FacSalary decimal(10,2), 
    FacSupervisor char(11),
    FacDept char(6),
 CONSTRAINT FacultyPK PRIMARY KEY (FacNo));

这是正确的吗? FACNO 列不为空,而且它也是主键。

【问题讨论】:

  • PK 总是 NOT NULL(并且是唯一的)。
  • PRIMARY KEY 只是 UNIQUE NOT NULL 的简写。
  • @jarlh 那么我们可以在主键中有一个空值吗?这就是作业有这个要求的原因?
  • 不,主键中不能有 NULL !!!
  • 我认为您的讲师要求提供与供应商无关的 sql,可能是其中的一个子集。出于教学目的,他们可能希望引出他们认为特别重要的方面。从技术上讲,唯一性约束不是必需的,您只需确保 pk 列不为空且唯一(通过您认为合适的任何方式)。

标签: sql oracle


【解决方案1】:

http://www.techonthenet.com/oracle/primary_keys.php

在 Oracle 中,主键是单个字段或字段组合 它唯一地定义了一条记录。没有属于的字段 主键可以包含空值。一个表只能有一个 主键。

当您为表设置PK 时,该列将设置为NOT NULL,即使您将其指定为可为空

-- Create table
create table t_test_pk(
  col1 varchar2(5) null
);


SQL> desc  t_test_pk
Name Type        Nullable Default Comments 
---- ----------- -------- ------- -------- 
COL1 VARCHAR2(5) Y                         

所以...该列可以为空

然后我们为表设置PK:

SQL> alter table t_test_pk add constraint pk_1 primary key (COL1);

Table altered

并尝试将 null 插入

SQL> insert into   t_test_pk values (null);

insert into   t_test_pk values (null)

ORA-01400: cannot insert NULL into ("T_TEST_PK"."COL1")

有些东西改变了!检查 SqlPlus - 该列不可为空 - 并得到错误...我们无法将 null 插入列中,因为它在 PK 中使用过

SQL> desc t_test_pk;
Name Type        Nullable Default Comments 
---- ----------- -------- ------- -------- 
COL1 VARCHAR2(5)                           

好的...尝试将其设置为可空

SQL> alter table t_test_pk modify col1 null;

alter table t_test_pk modify col1 null

ORA-01451: column to be modified to NULL cannot be modified to NULL

【讨论】:

  • 所以基本上我应该保留 NOT NULL 部分,只需将键定义为 PRIMARY KEY 就可以了?
【解决方案2】:

我想您的讲师要求这样做的原因是确保您编写的 DDL 清楚地表明您的意图。信任 null 到非 null 的自动转换无助于 DDL 的可读性,因此我要求编写所有 DDL,以便 create table 语句显示所有列的预期可空性。

【讨论】:

    【解决方案3】:

    问题已解决,使用以下查询

    CREATE TABLE Faculty(
    FacNo           char(11) not null,
    FacFirstName    varchar(30) not null,
    FacLastName     varchar(30) not null,
    FacCity         varchar(30) not null,
    FacState        char(2) not null,
    FacZipCode      char(10) not null,
    FacRank         char(4),
    FacHireDate     date,
    FacSalary       decimal(10,2),
    FacSupervisor   char(11),
    FacDept         char(6),
    CONSTRAINT FacultyPK PRIMARY KEY (FacNo) );
    

    【讨论】:

    • 将其移至您的问题。 (然后删除这个答案。)
    • @jarlh 我的代码没有以代码格式显示,我不知道是什么问题。但是我的问题已经解决了,所以我会留下它。还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2013-12-29
    • 2019-04-23
    • 2021-03-19
    • 2018-06-28
    相关资源
    最近更新 更多