4.1 作用
用来唯一标识表中的一行记录。
4.2 关键字
primary key
4.3 特点
- 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。

- 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
- 主键约束对应着表中的一列或者多列(复合主键)
- 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
- MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
- 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
- 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。
4.4 添加主键约束
(1)建表时指定主键约束
create table 表名称(字段名 数据类型 primary key, #列级模式字段名 数据类型,字段名 数据类型);create table 表名称(字段名 数据类型,字段名 数据类型,字段名 数据类型,[constraint 约束名] primary key(字段名) #表级模式);
举例:
create table temp(id int primary key,name varchar(20));
mysql> desc temp;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id | int(11) | NO | PRI | NULL | || name | varchar(20) | YES | | NULL | |+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)
insert into temp values(1,'张三');#成功insert into temp values(2,'李四');#成功
mysql> select * from temp;+----+------+| id | name |+----+------+| 1 | 张三 || 2 | 李四 |+----+------+2 rows in set (0.00 sec)
insert into temp values(1,'张三');#失败ERROR 1062 (23000): Duplicate(重复) entry(键入,输入) '1' for key 'PRIMARY'insert into temp values(1,'王五');#失败ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'insert into temp values(3,'张三');#成功
mysql> select * from temp;+----+------+| id | name |+----+------+| 1 | 张三 || 2 | 李四 || 3 | 张三 |+----+------+3 rows in set (0.00 sec)
insert into temp values(4,null);#成功insert into temp values(null,'李琦');#失败ERROR 1048 (23000): Column 'id' cannot be null
mysql> select * from temp;+----+------+| id | name |+----+------+| 1 | 张三 || 2 | 李四 || 3 | 张三 || 4 | NULL |+----+------+4 rows in set (0.00 sec)
#演示一个表建立两个主键约束create table temp(id int primary key,name varchar(20) primary key);ERROR 1068 (42000): Multiple(多重的) primary key defined(定义)
再举例:
- 列级约束
CREATE TABLE emp4(id INT PRIMARY KEY AUTO_INCREMENT ,NAME VARCHAR(20));
- 表级约束
CREATE TABLE emp5(id INT NOT NULL AUTO_INCREMENT,NAME VARCHAR(20),pwd VARCHAR(15),CONSTRAINT emp5_id_pk PRIMARY KEY(id));
(2)建表后增加主键约束
ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表); #字段列表可以是一个字段,也可以是多个字段,如果是多个字段的话,是复合主键
ALTER TABLE student ADD PRIMARY KEY (sid);
ALTER TABLE emp5 ADD PRIMARY KEY(NAME,pwd);
4.5 关于复合主键
create table 表名称(字段名 数据类型,字段名 数据类型,字段名 数据类型,primary key(字段名1,字段名2) #表示字段1和字段2的组合是唯一的,也可以有更多个字段);
#学生表create table student(sid int primary key, #学号sname varchar(20) #学生姓名);#课程表create table course(cid int primary key, #课程编号cname varchar(20) #课程名称);#选课表create table student_course(sid int,cid int,score int,primary key(sid,cid) #复合主键);
insert into student values(1,'张三'),(2,'李四');insert into course values(1001,'Java'),(1002,'MySQL');
mysql> select * from student;+-----+-------+| sid | sname |+-----+-------+| 1 | 张三 || 2 | 李四 |+-----+-------+2 rows in set (0.00 sec)mysql> select * from course;+------+-------+| cid | cname |+------+-------+| 1001 | Java || 1002 | MySQL |+------+-------+2 rows in set (0.00 sec)
insert into student_course values(1, 1001, 89),(1,1002,90),(2,1001,88),(2,1002,56);
mysql> select * from student_course;+-----+------+-------+| sid | cid | score |+-----+------+-------+| 1 | 1001 | 89 || 1 | 1002 | 90 || 2 | 1001 | 88 || 2 | 1002 | 56 |+-----+------+-------+4 rows in set (0.00 sec)
insert into student_course values(1, 1001, 100);ERROR 1062 (23000): Duplicate entry '1-1001' for key 'PRIMARY'
mysql> desc student_course;+-------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+---------+------+-----+---------+-------+| sid | int(11) | NO | PRI | NULL | || cid | int(11) | NO | PRI | NULL | || score | int(11) | YES | | NULL | |+-------+---------+------+-----+---------+-------+3 rows in set (0.00 sec)
- 再举例
CREATE TABLE emp6(id INT NOT NULL,NAME VARCHAR(20),pwd VARCHAR(15),CONSTRAINT emp7_pk PRIMARY KEY(NAME,pwd));
4.6 删除主键约束
alter table 表名称 drop primary key;
举例:
ALTER TABLE student DROP PRIMARY KEY;
ALTER TABLE emp5 DROP PRIMARY KEY;
说明:删除主键约束,不需要指定主键名,因为一个表只有一个主键,删除主键约束后,非空还存在。
