前言 ´・ᴗ・`
- 这里讲一下一些主键 外键有关的细节 可能做题面试什么的会考到 算是一个补充
- 同时深化 索引 概念的理解
组合主键 组合唯一键
主键 PRIMARY KEY
唯一键 UNIQUE
组合 把两列甚至多列放在一起 成一个键(KEY)
上代码就知道了,我们组合唯一键看看效果:
还是上一节的示例
USE data1;
DROP TABLE IF EXISTS project;
CREATE TABLE project(
项目编号 INT PRIMARY KEY, #PRIMARY KEY 跟在列后面的约束就是列约束 作用于一列
项目识别码 INT NOT NULL ,
专利申请号 CHAR(20) NOT NULL ,
项目名称 CHAR(20) NOT NULL ,
项目负责人 CHAR(20) NOT NULL ,
CONSTRAINT un_project UNIQUE (项目识别码,专利申请号,项目名称),
CONSTRAINT ck_responsibility CHECK(项目负责人 = 'Ryan' OR 项目负责人 = 'SST')
#另起一行 用逗号隔开的就是表级约束 可以约束多个列 就好像控制一个表一样
);
DESC project;
DESC结果:
然后
我们这么插入数据看看:
INSERT INTO project VALUES(1,2233,2333,'基于MEMS传感器的跌到检测系统','Ryan');
INSERT INTO project VALUES(2,2233,2333,'基于树莓派和内置深度学习算法的','Ryan1');
可见 第一条和第二条 虽然 项目识别码,专利申请号
都重复 但是没问题!
因为 这是组合成一起判断 是否唯一了
我们再加一句:
INSERT INTO project VALUES(3,2233,2333,'基于树莓派和内置深度学习算法的','Ryan1');
报错如下:
明显 CONSTRAINT un_project UNIQUE (项目识别码,专利申请号,项目名称),
这句 把三列组合在一起判断了
这就是组合唯一键
同样 你可以尝试组合主键:
加上这样的约束CONSTRINT:
CONSTRAINT pk_project PRIMARY KEY (项目编号,项目识别码,专利申请号,项目名称),
测试一下
另外 组合键一般不推荐 因为不够稳定
这里只是拓展视野之用
上一节的问题
上一节 列级约束与表级约束 一段 我们提到:
现在你就理解了 CONSTRAINT 后面跟着的不仅仅是约束名 也是一个新的键名字
也可以称为 索引 index
注意 既然是索引 是供别人查询的
记得命名要规范:
正确的命名 PRIMARY KEY - pk 我写的是pk_id_IMSI_ISO
CHECK - ck
这里下划线是黑色 背景遮盖了
外键补充
添加约束
当表已经创建完以后 我们也可以添加约束
1️⃣这里我们先尝试添加列级约束
还是上面的案例
DROP TABLE IF EXISTS project;
CREATE TABLE project(
项目编号 INT NOT NULL ,#PRIMARY KEY 跟在列后面的约束就是列约束 作用于一列
项目识别码 INT NOT NULL ,
专利申请号 CHAR(20) NOT NULL ,
项目名称 CHAR(20) NOT NULL ,
项目负责人 CHAR(20) NOT NULL ,
CONSTRAINT pk_project PRIMARY KEY(项目编号,项目识别码,专利申请号,项目名称),
CONSTRAINT ck_responsibility CHECK(项目负责人 = 'Ryan' OR 项目负责人 = 'SST')
#另起一行 用逗号隔开的就是表级约束 可以约束多个列 就好像控制一个表一样
);
我们运行一句:
ALTER TABLE project MODIFY COLUMN 项目编号 INT DEFAULT 18;
还记得二十五节 传送:
我们那个公式:
alter table [表名] add|drop|modify|change column [列名] [列类型] [约束]
我们其实是修改modify
只不过从无修改到有 就好像添加一样
结果 注意看success部分
DESC 可见DEFAULT已经添加了
为啥不用ADD关键字呢?别急 ADD用于 表级约束
2️⃣添加表级约束
ALTER TABLE project ADD CONSTRAINT un_name_responsibility UNIQUE(项目名称,项目负责人);
结果:
这里我们用
SHOW INDEX FROM project;
查询所有键 也就是索引
我们说过 键一般就是主键 PRIMARY KEY
和 唯一键 UNIQUE
注意 我们是添加约束 所以 约束名(键名 或者说索引不能重复)
你可以再运行一次
ALTER TABLE project ADD CONSTRAINT un_name_responsibility UNIQUE(项目名称,项目负责人);
就会这样:
duplicate 重复
当然了 我们还可以添加外键
删除约束 修改约束
其实添加没啥暖用一般——基本的属性创表就写好了嘛
主要是有冲突的时候 我说过 键名不能重复 不然没法添加新约束
这时 我们得修改约束
SQL挺蛋疼 得先删除 再添加
比如 上面的这句约束
ALTER TABLE project ADD CONSTRAINT un_name_responsibility UNIQUE(项目名称,项目负责人);
我少加了一个 应该是这样:
ALTER TABLE project ADD CONSTRAINT un_name_responsibility UNIQUE(专利申请号,项目名称,项目负责人);
咋办?没回头路了“There’s no way back.’”
先删再加:
1️⃣删除UNIQUE 我们用INDEX关键字
ALTER TABLE project DROP INDEX un_name_responsibility;
再检查一下:
SHOW INDEX FROM project;
2️⃣ok 下一步:
ALTER TABLE project ADD CONSTRAINT un_name_responsibility UNIQUE(专利申请号,项目名称,项目负责人);
SHOW INDEX FROM project;
3️⃣补充一下:对于主键 我们用 PRIMARY KEY关键字
对于外键 我们用FOREIGN KEY关键字
如果只有一个 可以不加键名 约束名
ALTER TABLE project DROP PRIMARY KEY;
ALTER TABLE project DROP FOREIGN KEY;
总结 ´◡`
这一节在上一节的基础上 更加深入讲解了约束类型
从此 我们正式结束了DDL的学习 恭喜!也恭喜你自己能够学到这里!
这里奖励一个萌妹子:
当然 革命尚未成功 同志任需努力
下一站 我们进入下一个语言的学习——TCL 一节给他结束 重在理解
数据库学习之MySQL (二十七)—— 事务 transaction 事务控制语言 TCL commit rollback
- 本文专栏
MySQL专栏 - 我的其他专栏 希望能够帮到你 ( •̀ ω •́ )✧
- 手把手带你学后端(服务端)
- python这么火 想要深入学习python 玩一下简单的应用嘛?
python应用
- 谢谢大佬支持! 萌新有礼了:)