mysql primary key not null_MYSQL 的 primary key 和unique key 的区别

Primary key 与Unique Key都是唯一性约束。但二者有很大的区别:

1、Primary key的1个或多个列必须为NOT NULL,如果列为NULL,在增加PRIMARY

KEY时,列自动更改为NOT NULL。而UNIQUE KEY 对列没有此要求。

2、一个表只能有一个PRIMARY KEY,但可以有多个UNIQUE KEY。

下面以测试说明:

SQL> create table t (a int,b int,c

int,d int);

Table created.

SQL> desc t

Name Null? Type

----------------------------------------- --------

-----------

A NUMBER(38)

B NUMBER(38)

C NUMBER(38)

D NUMBER(38)

SQL> alter table t add constraint pk_t primary

key (a,b);

Table altered.

SQL> desc t

Name Null? Type

----------------------------------------- --------

----------------

A NOT NULL NUMBER(38)

B NOT NULL NUMBER(38)

C NUMBER(38)

D NUMBER(38)

可以看到A、B两个列都自动改为了NOT NULL

SQL> alter table t modify (a int null);

alter table t modify (a int null)

*

ERROR at line 1:

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

NULL

可以看到,列A不允许改为NULL

SQL> alter table t drop constraint pk_t;

Table altered.

SQL> alter table t add constraint uk_t_1 unique

(a,b);

Table altered.

SQL> desc t

Name Null? Type

----------------------------------------- --------

-----------

A NUMBER(38)

B NUMBER(38)

C NUMBER(38)

D NUMBER(38)

我们看到列A又变回了NULL。

注意到,在删除主键时,列的NULLABLE会回到原来的状态。如果在创建主键后,对原来为NULL的主键列,显式设为NOT

NULL,在删除主键后仍然是NOT NULL。比如在创建主键后,执行下面的操作,可以看到:

SQL> alter table t modify (b int not null);

Table altered.

SQL> alter table t drop constraint pk_t;

Table altered.

SQL> desc t

Name Null? Type

----------------------------------------- --------

----------

A NUMBER(38)

B NOT NULL NUMBER(38)

C NUMBER(38)

D NUMBER(38)

再做如下的实验:

SQL> drop table t;

Table dropped.

SQL> create table t (a int,b int,c int,d

int);

Table created.

SQL> alter table t add constraint uk_t_1 unique

(a,b);

Table altered.

SQL> alter table t add constraint uk_t_2 unique

(c,d);

Table altered.

可以看到可以增加两个UNIQUE KEY。看看能不能增加两个主键:

SQL> alter table t add constraint pk_t primary

key (c);

Table altered.

SQL> alter table t add constraint pk1_t primary

key (d);

alter table t add constraint pk1_t primary key (d)

*

ERROR at line 1:

ORA-02260: table can have only one primary key

由此可以看到一个表只能有一个主键。

SQL> alter table t drop constraint pk_t;

Table altered.

SQL> insert into t (a ,b ) values

(null,null);

1 row created.

SQL> /

1 row created.

SQL> insert into t (a ,b ) values (null,1);

1 row created.

SQL> /

insert into t (a ,b ) values (null,1)

*

ERROR at line 1:

ORA-00001: unique constraint (SYS.UK_T_1) violated

SQL> insert into t (a ,b ) values (1,null);

1 row created.

SQL> /

insert into t (a ,b ) values (1,null)

*

ERROR at line 1:

ORA-00001: unique constraint (SYS.UK_T_1) violated

主键和唯一键约束是通过参考索引实施的,如果插入的值均为NULL,则根据索引的原理,全NULL值不被记录在索引上,所以插入全NULL值时,可以有重复的,而其他的则不能插入重复值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值