db2中null和空值的区别_MySQL主键与唯一约束区别

主键与唯一约束区别在面试有可能会被问到。可以从以下几个方面对比一下。

1、保证唯一性2、是否允许为空3、一个表可以有多少个4、是否允许组合

保证唯一性

两者都保证字段值的唯一性。

建一个学生表

create table student( id int PRIMARY key, #主键 name VARCHAR(20) NOT NULL,#非空 seat int UNIQUE#唯一)

id是主键,seat座位号唯一。

先插入两条id相同的数据测试。

mysql> insert into student -> (id,name,seat) -> VALUES -> (1,'haha',1), -> (1,'john',2);ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

上面语句是一次插入多条数据,报错因为id主键的值重复了,语句执行失败。

插入seat相同数据测试

mysql> insert into student (id,name,seat) VALUES (1,'haha',1), (2,'john',1);ERROR 1062 (23000): Duplicate entry '1' for key 'seat'

同样报错。

是否允许空值

在学生表中插入一条id为null的数据

mysql> insert into student ->(id,name,seat) ->VALUE -> (null,'haha',1);ERROR 1048 (23000): Column 'id' cannot be null

报错了,id的值不能为null。

以上语句将seat为null测试

mysql> insert into student -> (id,name,seat) -> VALUE -> (1,'haha',null);Query OK, 1 row affected (0.12 sec)

可以插入。

所以从两个实例得出,唯一性约束允许为空值,主键是不能为空值。

再插入一条seat为null的数据

 insert into student ->(id,name,seat) -> VALUE ->(2,'abcd',null);Query OK, 1 row affected (0.12 sec)

同样插入成功,查看一下表的数据

mysql> select * from student;+----+------+------+| id | name | seat |+----+------+------+| 1 | haha | NULL || 2 | abcd | NULL |+----+------+------+2 rows in set (0.00 sec)

唯一性的空值可以重复,猜测是mysql版本的问题,有兴趣可以深入研究一下。查看mysql版本可以用version函数

mysql> select version();+------------------+| version() |+------------------+| 5.1.30-community |+------------------+

一个表可以有多少个主键和唯一键?

试一下将name也作为主键,用修改语句操作

mysql> alter table student  modify name varchar(20) PRIMARY KEY;ERROR 1068 (42000): Multiple primary key defined

报错,主键重复定义了。

那将name改为唯一性约束试试,同样使用修改语句操作

mysql> alter table student  modify name varchar(20)  UNIQUE;Query OK, 2 rows affected (0.23 sec)Records: 2 Duplicates: 0 Warnings: 0

操作成功了,再添加一个majorId字段,也是唯一性约束,测试

mysql> alter table student  add majorId int UNIQUE;Query OK, 2 rows affected (0.29 sec)Records: 2 Duplicates: 0 Warnings: 0

依然成功。

所以,一张表,主键最多有一个,而唯一性键可以有多个。

是否允许组合

假设两个字段组合成主键,那定义时格式:PRIMARY KEY(字段1,字段2)。在表级约束添加。

执行以下语句,将原表删除,重新建表,id和name作为主键。

drop table if EXISTS studentmysql> create table student( ->id int, ->name VARCHAR(20), -> seat int, -> PRIMARY KEY(id,name) -> );Query OK, 0 rows affected (0.16 sec)

建表成功,说明主键是可以组合的,用 show index from student 语句看一下表的索引(索引的知识以后会整理)

ef157710e0bd4446e5432574f8c3b6af.png

看起来有两个主键,一个是id,一个是name。其实不然,可以插入数据测试看看。

插入两条数据,id都为1,name值不同

mysql> insert into student  (id,name,seat)  VALUES (1,'haha',1), (1,'john',2);Query OK, 2 rows affected (0.12 sec)Records: 2 Duplicates: 0 Warnings: 0

可以看到数据插入成功了,再插入一条id=1,name=haha的数据试试

mysql> insert into student  (id,name,seat) VALUE (1,'haha',1);ERROR 1062 (23000): Duplicate entry '1-haha' for key 'PRIMARY'

插入失败了。因为id=1并且name=haha的数据已经存在表中,不能重复插入,所以组合主键代表的还是一个主键,组合中所有列保证唯一性

同样,唯一键也允许组合,添加格式:UNIQUE(字段1,字段2)。效果和组合主键也是一样的,不再测试了。

两者的对比就到这。总结一下,主键保证值的唯一性,不允许空值,一张表最多只能定义一个主键,允许组合,组合主键代表一个主键。唯一键也是保证值的唯一,但允许允许空值,一张表可以有多个唯一键,允许组合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值