前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PRIMARY KEY联合主键

PRIMARY KEY联合主键

作者头像
诡途
发布2022-05-09 19:05:46
1.9K0
发布2022-05-09 19:05:46
举报
文章被收录于专栏:诡途的python路

阅读指南

基本概念

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 阅读指南
  • 基本概念
  • 创建表时定义主键约束
  • 修改表时定义主键约束
  • 删除主键约束
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档