Sql 主键不为空

Sql 主键不为空,sql,oracle,Sql,Oracle,我正在做一个Sql赋值,我需要在其中创建几个表。任务要求: 确保为每个表的PK定义了非空约束 我不明白。当我们将一个键定义为主键时,为什么我们要用它单独编写notnull?将密钥定义为主键本身不意味着不为null和唯一吗 请解释 编辑(从下面复制): 这是正确的吗?FACNO列不是空的,而且也是主键。通过以下查询解决了问题 CREATE TABLE Faculty( FacNo char(11) not null, FacFirstName varchar(30) no

我正在做一个Sql赋值,我需要在其中创建几个表。任务要求:

确保为每个表的PK定义了非空约束

我不明白。当我们将一个键定义为主键时,为什么我们要用它单独编写
notnull
?将密钥定义为
主键本身不意味着不为null和唯一吗

请解释

编辑(从下面复制):


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

通过以下查询解决了问题

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

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

当您为表格设置
PK
时,该列将被设置为
notnull
,即使您将其指定为可空

-- 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                         
所以。。。该列可为空

-- 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
并尝试在

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)                           
好的。。。尝试将其设置为nullable

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

我想您的讲师要求这样做的原因是为了确保您编写的DDL能够清楚地显示您的意图。信任null到NOTNULL的自动转换对DDL的可读性没有帮助,因此我请求写入所有DDL,以便create table语句显示所有列的预期null。

PK总是NOTNULL(和unique)。主键只是unique NOTNULL的简写。@jarlh这样我们就可以在主键中使用null值了吗?这就是为什么赋值有这样的要求?不,主键中不能有空值!!!我认为您的指导者要求使用与供应商无关的sql,可能是其中的一个子集。为了教学目的,他们可能想要引出他们认为特别重要的方面。从技术上讲,唯一性约束是不必要的,您只需确保pk列不是null和唯一的(通过您认为合适的任何方式)。将此移到您的问题。(然后删除此答案。)@jarlh我的代码没有以代码格式显示,我不知道问题出在哪里。但我的问题已经解决了,所以我就不提了。无论如何谢谢你!所以基本上我应该保留NOTNULL部分,只需将键定义为主键就可以了?