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 student mysql> 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 语句看一下表的索引(索引的知识以后会整理)

看起来有两个主键,一个是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)。效果和组合主键也是一样的,不再测试了。
两者的对比就到这。总结一下,主键保证值的唯一性,不允许空值,一张表最多只能定义一个主键,允许组合,组合主键代表一个主键。唯一键也是保证值的唯一,但允许允许空值,一张表可以有多个唯一键,允许组合。
相关推荐
-
PHP8种变量类型的详细讲解2025-02-22 00:32:24
-
php+apache 和 php+nginx的区别2025-02-22 00:21:27
-
PHP:与workerman结合实现定时任务2025-02-22 00:15:57
-
Nginx的Rewrite规则与实例2025-02-22 00:15:39
-
MySql中身份证字段的简单脱敏介绍2025-02-22 00:15:36