主键(PRIMARY KEY)的完整称呼是“主键约束”;
作用
:为了便于 DBMS 更快的查找到表中的记录;
分类
:①单字段主键;②多字段联合主键;
注意
:
①每个表只能定义一个主键
②唯一性原则
即主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据
③一个字段名只能在联合主键字段表中出现一次
④联合主键的最小化原则
即联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。
一)单字段主键
#基本语法
#一、在定义字段的同时指定主键
<字段名> <数据类型> PRIMARY KEY [默认值]
#二、或在定义完所有字段之后指定主键
[CONSTRAINT <约束名>] PRIMARY KEY [字段名]
示例1:在定义字段的同时指定主键
mysql> CREATE TABLE test001(
-> zd0 INT(10) PRIMARY KEY,
-> zd1 VARCHAR(25),
-> zd2 CHAR(10),
-> zd3 FLOAT);
Query OK, 0 rows affected, 1 warning (0.10 sec)
mysql> desc test001;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| zd0 | int(10) | NO | PRI | NULL | |
| zd1 | varchar(25) | YES | | NULL | |
| zd2 | char(10) | YES | | NULL | |
| zd3 | float | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
示例2:在定义完所有字段之后指定主键
mysql> CREATE TABLE test002(
-> zd0 INT(10),
-> zd1 VARCHAR(25),
-> zd2 CHAR(10),
-> zd3 FLOAT,
-> PRIMARY KEY(zd0));
Query OK, 0 rows affected, 1 warning (0.06 sec)
mysql> desc test002;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| zd0 | int(10) | NO | PRI | NULL | |
| zd1 | varchar(25) | YES | | NULL | |
| zd2 | char(10) | YES | | NULL | |
| zd3 | float | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
二) 多字段主键——又称联合主键
#基本语法
PRIMARY KEY [字段1,字段2,…,字段n]
注意:
当主键是由多个字段组成时,
只能在定义完所有字段之后指定主键
,
不能直接在字段名后面声明主键约束。
示例3:联合主键的指定
mysql> CREATE TABLE test003(
-> zd0 INT(10),
-> zd1 VARCHAR(25),
-> zd2 CHAR(10),
-> zd3 FLOAT,
-> PRIMARY KEY(zd0,zd1,zd2));
Query OK, 0 rows affected, 1 warning (0.06 sec)
mysql> desc test003
-> ;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| zd0 | int(10) | NO | PRI | NULL | |
| zd1 | varchar(25) | NO | PRI | NULL | |
| zd2 | char(10) | NO | PRI | NULL | |
| zd3 | float | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
#基本语法
ALTER TABLE <数据表名> ADD PRIMARY KEY(<字段名>);
当在修改表时要设置表中某个字段的主键约束时,
要确保设置成主键约束的字段中值不能够有重复
的,
并且要保证是非空
的。否则,无法设置主键约束。
(见文末示例4)
#基本语法
ALTER TABLE <数据表名> DROP PRIMARY KEY;
由于主键约束在一个表中只能有一个, 因此不需要指定主键名就可以删除一个表中的主键约束。
示例4:指定已存在表的主键和删除主键约束
#创建无主键的表
mysql> CREATE TABLE test004(
-> zd0 INT(10),
-> zd1 VARCHAR(25),
-> zd2 CHAR(10),
-> zd3 FLOAT);
Query OK, 0 rows affected, 1 warning (0.06 sec)
#查看指定主键前的表结构
mysql> desc test004;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| zd0 | int(10) | YES | | NULL | |
| zd1 | varchar(25) | YES | | NULL | |
| zd2 | char(10) | YES | | NULL | |
| zd3 | float | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
#指定单主键
mysql> ALTER TABLE test004 ADD PRIMARY KEY(zd0);
Query OK, 0 rows affected (0.23 sec)
Records: 0 Duplicates: 0 Warnings: 0
#查看指定主键后的表结构
mysql> desc test004;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| zd0 | int(10) | NO | PRI | NULL | |
| zd1 | varchar(25) | YES | | NULL | |
| zd2 | char(10) | YES | | NULL | |
| zd3 | float | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
#删除主键
mysql> ALTER TABLE test004 DROP PRIMARY KEY;
Query OK, 0 rows affected (0.18 sec)
Records: 0 Duplicates: 0 Warnings: 0
#查看删除主键后的表结构
mysql> desc test004;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| zd0 | int(10) | NO | | NULL | |
| zd1 | varchar(25) | YES | | NULL | |
| zd2 | char(10) | YES | | NULL | |
| zd3 | float | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
#指定多字段主键
mysql> ALTER TABLE test004 ADD PRIMARY KEY(zd0,zd1,zd2);
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
#查看指定多段主键后的表结构
mysql> desc test004;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| zd0 | int(10) | NO | PRI | NULL | |
| zd1 | varchar(25) | NO | PRI | NULL | |
| zd2 | char(10) | NO | PRI | NULL | |
| zd3 | float | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
注意: 未指定not null 的字段设置为PK后, 再删除PK约束(无其他操作),则该字段不允许为null