4.1 作用

用来唯一标识表中的一行记录。

4.2 关键字

primary key

4.3 特点

  • 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。1555427492244.png
  • 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
  • 主键约束对应着表中的一列或者多列(复合主键)
  • 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
  • MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
  • 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
  • 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。

4.4 添加主键约束

(1)建表时指定主键约束

  1. create table 表名称(
  2. 字段名 数据类型 primary key, #列级模式
  3. 字段名 数据类型,
  4. 字段名 数据类型
  5. );
  6. create table 表名称(
  7. 字段名 数据类型,
  8. 字段名 数据类型,
  9. 字段名 数据类型,
  10. [constraint 约束名] primary key(字段名) #表级模式
  11. );

举例:

  1. create table temp(
  2. id int primary key,
  3. name varchar(20)
  4. );
  1. mysql> desc temp;
  2. +-------+-------------+------+-----+---------+-------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +-------+-------------+------+-----+---------+-------+
  5. | id | int(11) | NO | PRI | NULL | |
  6. | name | varchar(20) | YES | | NULL | |
  7. +-------+-------------+------+-----+---------+-------+
  8. 2 rows in set (0.00 sec)
  1. insert into temp values(1,'张三');#成功
  2. insert into temp values(2,'李四');#成功
  1. mysql> select * from temp;
  2. +----+------+
  3. | id | name |
  4. +----+------+
  5. | 1 | 张三 |
  6. | 2 | 李四 |
  7. +----+------+
  8. 2 rows in set (0.00 sec)
  1. insert into temp values(1,'张三');#失败
  2. ERROR 1062 (23000): Duplicate(重复) entry(键入,输入) '1' for key 'PRIMARY'
  3. insert into temp values(1,'王五');#失败
  4. ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
  5. insert into temp values(3,'张三');#成功
  1. mysql> select * from temp;
  2. +----+------+
  3. | id | name |
  4. +----+------+
  5. | 1 | 张三 |
  6. | 2 | 李四 |
  7. | 3 | 张三 |
  8. +----+------+
  9. 3 rows in set (0.00 sec)
  1. insert into temp values(4,null);#成功
  2. insert into temp values(null,'李琦');#失败
  3. ERROR 1048 (23000): Column 'id' cannot be null
  1. mysql> select * from temp;
  2. +----+------+
  3. | id | name |
  4. +----+------+
  5. | 1 | 张三 |
  6. | 2 | 李四 |
  7. | 3 | 张三 |
  8. | 4 | NULL |
  9. +----+------+
  10. 4 rows in set (0.00 sec)
  1. #演示一个表建立两个主键约束
  2. create table temp(
  3. id int primary key,
  4. name varchar(20) primary key
  5. );
  6. ERROR 1068 (42000): Multiple(多重的) primary key defined(定义)

再举例:

  • 列级约束
  1. CREATE TABLE emp4(
  2. id INT PRIMARY KEY AUTO_INCREMENT ,
  3. NAME VARCHAR(20)
  4. );
  • 表级约束
  1. CREATE TABLE emp5(
  2. id INT NOT NULL AUTO_INCREMENT,
  3. NAME VARCHAR(20),
  4. pwd VARCHAR(15),
  5. CONSTRAINT emp5_id_pk PRIMARY KEY(id)
  6. );

(2)建表后增加主键约束

  1. ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表); #字段列表可以是一个字段,也可以是多个字段,如果是多个字段的话,是复合主键
  1. ALTER TABLE student ADD PRIMARY KEY (sid);
  1. ALTER TABLE emp5 ADD PRIMARY KEY(NAME,pwd);

4.5 关于复合主键

  1. create table 表名称(
  2. 字段名 数据类型,
  3. 字段名 数据类型,
  4. 字段名 数据类型,
  5. primary key(字段名1,字段名2) #表示字段1和字段2的组合是唯一的,也可以有更多个字段
  6. );
  1. #学生表
  2. create table student(
  3. sid int primary key, #学号
  4. sname varchar(20) #学生姓名
  5. );
  6. #课程表
  7. create table course(
  8. cid int primary key, #课程编号
  9. cname varchar(20) #课程名称
  10. );
  11. #选课表
  12. create table student_course(
  13. sid int,
  14. cid int,
  15. score int,
  16. primary key(sid,cid) #复合主键
  17. );
  1. insert into student values(1,'张三'),(2,'李四');
  2. insert into course values(1001,'Java'),(1002,'MySQL');
  1. mysql> select * from student;
  2. +-----+-------+
  3. | sid | sname |
  4. +-----+-------+
  5. | 1 | 张三 |
  6. | 2 | 李四 |
  7. +-----+-------+
  8. 2 rows in set (0.00 sec)
  9. mysql> select * from course;
  10. +------+-------+
  11. | cid | cname |
  12. +------+-------+
  13. | 1001 | Java |
  14. | 1002 | MySQL |
  15. +------+-------+
  16. 2 rows in set (0.00 sec)
  1. insert into student_course values(1, 1001, 89),(1,1002,90),(2,1001,88),(2,1002,56);
  1. mysql> select * from student_course;
  2. +-----+------+-------+
  3. | sid | cid | score |
  4. +-----+------+-------+
  5. | 1 | 1001 | 89 |
  6. | 1 | 1002 | 90 |
  7. | 2 | 1001 | 88 |
  8. | 2 | 1002 | 56 |
  9. +-----+------+-------+
  10. 4 rows in set (0.00 sec)
  1. insert into student_course values(1, 1001, 100);
  2. ERROR 1062 (23000): Duplicate entry '1-1001' for key 'PRIMARY'
  1. mysql> desc student_course;
  2. +-------+---------+------+-----+---------+-------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +-------+---------+------+-----+---------+-------+
  5. | sid | int(11) | NO | PRI | NULL | |
  6. | cid | int(11) | NO | PRI | NULL | |
  7. | score | int(11) | YES | | NULL | |
  8. +-------+---------+------+-----+---------+-------+
  9. 3 rows in set (0.00 sec)
  • 再举例
  1. CREATE TABLE emp6(
  2. id INT NOT NULL,
  3. NAME VARCHAR(20),
  4. pwd VARCHAR(15),
  5. CONSTRAINT emp7_pk PRIMARY KEY(NAME,pwd)
  6. );

4.6 删除主键约束

  1. alter table 表名称 drop primary key;

举例:

  1. ALTER TABLE student DROP PRIMARY KEY;
  1. ALTER TABLE emp5 DROP PRIMARY KEY;

说明:删除主键约束,不需要指定主键名,因为一个表只有一个主键,删除主键约束后,非空还存在。