主键不为空

时间:2015-11-30 09:39:06

标签: sql oracle

我正在做一个Sql赋值,我需要创建一些表。作业要求:

  

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

我不明白。当我们将密钥定义为主键时,我们为什么要单独编写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列不为空,而且它也是主键。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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) );

答案 2 :(得分:0)

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