主键约束(PRIMARY KEY)
主键约束的特点:
-
主键约束相当于唯一性约束+ 非空约束,主键约束不允许重复,也不允许出现空值
-
一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以再表级别创建
-
主键约束对应着表中的一列或者多列
- 对应着多列的时候就是复合主键(可以类比我们之前讲过的复合唯一性约束)
-
如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值也不允许重复
-
MySQL中的主键约束名永远都是PRIMARY,就算我们自己命名了主键约束名,这个时候主键约束名也还是PRIMARY,不会改变
-
当创建主键约束时,系统默认会在主键约束所在的列或者列组合上建立对应的主键索引,如果删除主键约束,那么主键索引也就自动删除了
- 当一个表中有主键约束时,系统会默认根据主键约束对应的主键索引来构建一个B+tree的结构,用于存储表中的数据,在这种B+tree的结构下查询的效率更高
-
需要注意: 不要修改主键字段的值,因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性
- 关于数据的完整性我们在约束概述中讲到过,数据完整性可以从四个方面来讲
如何添加主键约束?
对于如何添加主键约束我们也分为两种方式(其实我们可以发现,我们添加约束时都有两种情况,一种是在CREATE TABLE时添加,一种是在ALTER TABLE时添加,而在删除约束时都是在ALTER TABLE是删除约束)
方式一: 在CREATE TABLE时添加主键约束
下面我们通过举例来学习如何添加主键约束
CREATE TABLE test4(
id INT PRIMARY KEY,
last_name VARCHAR(15),
salary DECIMAL(10,2),
email VARCHAR(25)
);
- 这里我们就是给id字段添加了一个列级的主键约束
- 主键约束 : 非空且唯一,用于唯一标识表中的一条记录
- 为什么是唯一标识表中的一条记录?
如果是唯一约束,那么只是字段的值不能重复, 但是还有可能是有多个null,因为我们的唯一约束中可以有多个null那么这个时候我们再添加上非空约束之后,这个时候就只能是唯一的一个值了,不能为null,所以我们也说主键约束就是唯一约束 + 非空约束
- 为什么是唯一标识表中的一条记录?
我们在一个表中只能添加一个主键约束,如果我们给表中添加多个主键约束,这个时候就会报错:
eg:
CREATE TABLE test5(
id INT PRIMARY KEY,
last_name VARCHAR(15) PRIMARY KEY,
salary DECIMAL(10,2)
);
如何创建复合主键约束?
这里我们通过举例来说明
CREATE TABLE test6(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10),
email VARCHAR(25),
#这里我们就是添加了一个表级约束,同时一个复合约束,这里同时给id字段和last_name字段添加了主键约束
CONSTRAINT pk_test6_id_name PRIMARY KEY(id,last_name)
);
- 我们上面就是创建了一个复合主键约束,同时约束了id字段和last_name字段
- 我们还用constraint关,键字尝试给这个表级复合主键约束来起名,但是我们前面说过: 在MySQL中主键约束名始终为PRIMARY,不可以更改,如果更改就会发现更改了之后主键约束名还是PRIMARY
那么添加了主键约束之后有什么效果,这里我们就来做一个测试
INSERT INTO test6
VALUES
(1,'tom',3000,'tom@126.com'),
(2,'tom',3000,'tom@126.com');
- 这个时候我们可以发现数据是添加成功的,那么也就是说明我们的复合主键约束中只要复合列中的字段值不是都相同,这个时候就不算重复,这个时候就可以添加成功,比如这里: 就是添加的两条记录的last_name相同,但是两条记录的id是不相同的,这个时候就算做不重复,也就是可以添加成功
INSERT INTO test6
VALUES
(NULL,'tom',3000,'tom@126.com');
- 这个时候我们可以发现我们的这条记录显示添加失败,为什么?我们的主键约束相当于唯一约束+ 非空约束,对于我们主键的唯一性,我们要求复合字段的值只要不相同就行,但是对于非空性,只要复合字段中的值有一个为null,那么这条数据都会添加失败
总结: 如果是多列组合的复合主键约束,那么这些列中不允许有一个null值,并且这些列中组合的值不允许重复
方式二: 在ALTER TABLE时添加主键约束
首先我们先来创建一个新表,然后再这个新表中通过ALTER TABLE的方式添加主键约束
CREATE TABLE test7(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2),
email VARCHAR(25)
);
- 这里我们创建一个test7表,在这个test7表中不添加主键约束
这里我们通过ALTER TABLE的操作来添加主键约束
ALTER TABLE test6
ADD PRIMARY KEY(id);
- 这里我们就是给id字段添加了一个主键约束
那么我们如何删除主键约束?
我们这里通过举例说明(ALTER TABLE)
ALTER TABLE test6
DROP PRIMARY KEY;
- 由于我们的一个表中只有一个主键约束,所以我们在删除主键约束的时候不需要指定主键名
注意: 我们删除主键约束之后,非空约束还在,也就是还会保留有非空约束,也就是我们删除主键约束之后我们还是要注意: 我们这个时候还是不能再这个设置过主键约束的字段中添加null值
补充:
我们在实际编程中不会去删除主键约束,因为在数据库底层会通过B+tree的方式存储数据,如果有主键约束,则就会使用主键索引作为B+tree的存储的一句,如果没有主键,那么就通过其他类型的约束对应的索引来作为B+tree的存储的依据,如果没有约束,则系统会指定一个字段作为依据,那么如果我们有主键约束,这个时候我们删除掉这个主键约束之后,那么表中几千万条的记录就需要重新来存储,因为这个时候主键约束删除之后主键索引也就跟着被删除了,所以没有人会在实际编程中去删除主键索引