玖叶教程网

前端编程开发入门

MySQL主键与唯一约束区别(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)。效果和组合主键也是一样的,不再测试了。

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

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言