PRIMARY KEY联合主键

2022-05-09 19:05:46 浏览数 (1)

阅读指南

  • 基本概念
  • 创建表时定义主键约束
  • 修改表时定义主键约束
  • 删除主键约束

基本概念

主键(PRIMARY KEY)的完整称呼是“主键约束”;

作用:为了便于 DBMS 更快的查找到表中的记录;

分类:①单字段主键;②多字段联合主键;

注意

①每个表只能定义一个主键

唯一性原则 即主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据

③一个字段名只能在联合主键字段表中出现一次

联合主键的最小化原则 即联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。

创建表时定义主键约束

一)单字段主键

代码语言:javascript复制
#基本语法
#一、在定义字段的同时指定主键
<字段名> <数据类型> PRIMARY KEY [默认值]
#二、或在定义完所有字段之后指定主键
[CONSTRAINT <约束名>] PRIMARY KEY [字段名]

示例1:在定义字段的同时指定主键

代码语言:javascript复制
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:在定义完所有字段之后指定主键

代码语言:javascript复制
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)

二) 多字段主键——又称联合主键

代码语言:javascript复制
#基本语法
PRIMARY KEY [字段1,字段2,…,字段n]

注意: 当主键是由多个字段组成时, 只能在定义完所有字段之后指定主键, 不能直接在字段名后面声明主键约束。

示例3:联合主键的指定

代码语言:javascript复制
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)

修改表时定义主键约束

代码语言:javascript复制
#基本语法
ALTER TABLE <数据表名> ADD PRIMARY KEY(<字段名>);

当在修改表时要设置表中某个字段的主键约束时, 要确保设置成主键约束的字段中值不能够有重复的, 并且要保证是非空的。否则,无法设置主键约束。

(见文末示例4)

删除主键约束

代码语言:javascript复制
#基本语法
ALTER TABLE <数据表名> DROP PRIMARY KEY;

由于主键约束在一个表中只能有一个, 因此不需要指定主键名就可以删除一个表中的主键约束。

示例4:指定已存在表的主键和删除主键约束

代码语言:javascript复制
#创建无主键的表
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

0 人点赞