“主键(PRIMARY KEY)”的完整称呼是“主键约束”。MySQL 主键约束是一个列或者列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可以强制表的实体完整性。主键约束即在表中定义一个主键来唯一确定表中每一行数据的标识符。主键可以是表中的某一列或者多列的组合,其中由多列组合的主键称为复合主键。主键应该遵守下面的规则:

  • 每个表只能定义一个主键。
  • 主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在两行数据有相同的主键值。这是唯一性原则。
  • 一个列名只能在复合主键列表中出现一次。
  • 复合主键不能包含不必要的多余列。当把复合主键的某一列删除后,如果剩下的列构成的主键仍然满足唯一性原则,那么这个复合主键是不正确的。这是最小化原则。

1、在创建表时添加主键约束

配置方法有两种:

一种是在 CREATE TABLE 语句中,主键是通过 PRIMARY KEY 关键字来指定的。在定义列的同时指定主键,语法规则如下:
<字段名> <数据类型> PRIMARY KEY [默认值]

例:在 test_db 数据库中创建 tb_emp 1 数据表,其主键为 id

 1mysql> CREATE TABLE tb_emp1
 2    -> (
 3    -> id INT(11) PRIMARY KEY,
 4    -> name VARCHAR(25),
 5    -> deptId INT(11),
 6    -> salary FLOAT
 7    -> );
 8Query OK, 0 rows affected (0.37 sec)
 9mysql> DESC tb_emp1;
10+--------+-------------+------+-----+---------+-------+
11| Field  | Type        | Null | Key | Default | Extra |
12+--------+-------------+------+-----+---------+-------+
13| id     | int(11)     | NO   | PRI | NULL    |       |
14| name   | varchar(25) | YES  |     | NULL    |       |
15| deptId | int(11)     | YES  |     | NULL    |       |
16| salary | float       | YES  |     | NULL    |       |
17+--------+-------------+------+-----+---------+-------+
184 rows in set (0.14 sec)

第二种方法是在定义完所有列之后,指定主键的语法格式为:

 1[CONSTRAINT <约束名>] PRIMARY KEY [字段名]
 2示例:在 test_db 数据库中创建 tb_emp 2 数据表,其主键为 id
 3mysql> CREATE TABLE tb_emp2
 4    -> (
 5    -> id INT(11),
 6    -> name VARCHAR(25),
 7    -> deptId INT(11),
 8    -> salary FLOAT,
 9    -> PRIMARY KEY(id)
10    -> );
11Query OK, 0 rows affected (0.37 sec)
12mysql> DESC tb_emp2;
13+--------+-------------+------+-----+---------+-------+
14| Field  | Type        | Null | Key | Default | Extra |
15+--------+-------------+------+-----+---------+-------+
16| id     | int(11)     | NO   | PRI | NULL    |       |
17| name   | varchar(25) | YES  |     | NULL    |       |
18| deptId | int(11)     | YES  |     | NULL    |       |
19| salary | float       | YES  |     | NULL    |       |
20+--------+-------------+------+-----+---------+-------+
214 rows in set (0.14 sec)

2、在创建表后添加主键约束

创建表后,可以在修改数据表时添加主键约束,语法规则为:

 1ALTER TABLE <数据表名> ADD PRIMARY KEY(<列名>);
 2示例:修改数据表 tb_emp3,将字段 id 设置为主键
 3mysql> ALTER TABLE tb_emp3 ADD PRIMARY KEY(id);
 4Query OK, 0 rows affected (0.94 sec)
 5Records: 0  Duplicates: 0  Warnings: 0
 6mysql> DESC tb_emp3;
 7+--------+-------------+------+-----+---------+-------+
 8| Field  | Type        | Null | Key | Default | Extra |
 9+--------+-------------+------+-----+---------+-------+
10| id     | int(11)     | NO   | PRI | NULL    |       |
11| name   | varchar(30) | YES  |     | NULL    |       |
12| deptId | int(11)     | YES  |     | NULL    |       |
13| salary | float       | YES  |     | NULL    |       |
14+--------+-------------+------+-----+---------+-------+
154 rows in set (0.12 sec)

3、设置复合主键

也可以在创建表时添加复合主键,此时主键由多个字段联合组成,语法规则如下:PRIMARY KEY [字段1,字段2,…,字段n]

示例:创建数据表 tb_emp4,假设表中没有主键 id,为了唯一确定一个员工,可以把 name、deptId 联合起来作为主键

 1mysql> CREATE TABLE tb_emp4
 2    -> (
 3    -> name VARCHAR(25),
 4    -> deptId INT(11),
 5    -> salary FLOAT,
 6    -> PRIMARY KEY(id,deptId)
 7    -> );
 8Query OK, 0 rows affected (0.37 sec)
 9mysql> DESC tb_emp4;
10+--------+-------------+------+-----+---------+-------+
11| Field  | Type        | Null | Key | Default | Extra |
12+--------+-------------+------+-----+---------+-------+
13| name   | varchar(25) | NO   | PRI | NULL    |       |
14| deptId | int(11)     | NO   | PRI | NULL    |       |
15| salary | float       | YES  |     | NULL    |       |
16+--------+-------------+------+-----+---------+-------+
173 rows in set (0.14 sec)

4、删除主键

针对已经存在表,添加联合主键

1格式:alter table 表名 add primary key(列名1,列名2);
2格式:alter table 表名 add constraint 主键约束的名字 primary key(列名1,列名2);

删除主键约束格式

1alter table 表名 drop primary key;

删除自增长的主键id

1先删除自增长,再删除主键
2Alter table tb change id id int(10);//删除自增长
3Alter table tb drop primary key;//删除主建