欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PRIMARY KEY联合主键

程序员文章站 2022-04-25 07:56:14
...

基本概念

主键(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