数据库学习之MySQL (二十六)—— DDL(四)约束 - 主键 外键详解 添加约束 删除约束 修改约束

前言 ´・ᴗ・`

  • 这里讲一下一些主键 外键有关的细节 可能做题面试什么的会考到 算是一个补充
  • 同时深化 索引 概念的理解

组合主键 组合唯一键

主键 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的学习 恭喜!也恭喜你自己能够学到这里!
下一站:

另外,

  • 想系统的学习数据库嘛?
    MySQL专栏

  • python这么火 想要深入学习python 玩一下简单的应用嘛?可以看我专栏 还在持续更新中哦:
    python应用

  • 小孩子才做选择 大人全都要!对后端感兴趣吗?收下它吧:)
    手把手带你学后端(服务端)

  • 谢谢大佬支持! 萌新有礼了:)

发布了39 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43178828/article/details/104202078