前言 ´・ᴗ・`
- 本篇内容将会帮助你学习几乎所有数据库用到的约束类型
约束(constrain)
约束 就是规则
更改约束最好是在——创建表的时候更改
否则会让数据库有不可控的风险
当然你觉得数据库尚存的数据不会和你的新约束(规则)有冲突也ok
这里我们有两种划分方式 一种是按功能 称为六大约束
一种按语法形式 或者说作用范围 称为列级与表级
介绍常用六大约束
代码 | 解释 | 英文 | 中文 |
---|---|---|---|
DEFAULT | 指定默认值 | default | 默认值 |
NOT NULL | 非空 | not | 否定 |
UNIQUE | 值唯一 | unique | 独一无二的 |
CHECK | 检查值内容 | check | 检查 |
PRIMARY KEY | 主键 | primary key | 主要的键位 |
FOREIGN KEY | 外键 | foreign key | 外部键位 |
注意 CHECK 其实MySQL不支持 然而我们有别的方法解决。
甚至不用sql语句 而是往上叠加的web application 服务端(后端)应用 在上层限制就行了
感兴趣后端可以到文章末尾看我后端的专栏。
讨论 unique 唯一 倒是允许NULL
那如果有两个数据都是NULL行不?
不行! 因为NULL == NULL 只允许一个
其实都用上UNIQUE了 没必要为空了吧 顺手加上NOT NULL
是一种美德2333
外键 foreign key
必须在从表里面 也就当前表的属性 是受另外哪个表的值所控制的
注意 这里我们就产生了依赖关系
一个表(表1)有外键,REFERENCE
另一个表,也就是依赖另一个表(表2),
那么 删除表2是不允许的 因为表1还在
表2走了 表1的reference 参考 怎么参考呢?
所以 我们删库跑路 的时候就应该明确外键关系 再删 不然删库都报错:)
列级约束与表级约束
另外一种划分方式就是分为列级约束与表级约束
教科书上这么写的
表级约束与列级约束
(1)对一个数据列建立的约束,称为列级约束
(2)对多个数据列建立的约束,称为表级约束
(3)列级约束既可以在列定义时声明,也可以在列定以后声明
(4)表级约束只能在列定义后声明
上案例 你就懂了
DROP TABLE IF EXISTS project;
CREATE TABLE project(
项目编号 INT PRIMARY KEY, #PRIMARY KEY 跟在列后面的约束就是列约束 作用于一列
项目识别码 INT NOT NULL ,
项目名称 CHAR(20) NOT NULL ,
项目负责人 CHAR(20) NOT NULL ,
CONSTRAINT un_project UNIQUE (项目识别码,项目名称,项目负责人),
CONSTRAINT ck_responsibility CHECK(项目负责人 = 'Ryan' OR 项目负责人 = 'SST')
#另起一行 用逗号隔开的就是表级约束 可以约束多个列 就好像控制一个表一样
);
DESC project;
DESC后效果:
CONSTRAINT [约束名]
是用来命名约束的 这个会后面会用到的
意味着你可以这么写 便于理解 (虽然实际中不推荐):
CREATE TABLE project(
项目编号 INT PRIMARY KEY, #PRIMARY KEY 跟在列后面的约束就是列约束 作用于一列
项目识别码 INT NOT NULL ,
项目名称 CHAR(20) NOT NULL ,
项目负责人 CHAR(20) NOT NULL ,
UNIQUE (项目识别码,项目名称,项目负责人),
CHECK(项目负责人 = 'Ryan' OR 项目负责人 = 'SST')
#另起一行 用逗号隔开的就是表级约束 可以约束多个列 就好像控制一个表一样
);
问题:NOT NULL这么多 冗余 为啥不加到表级约束里面?
回答:
注意 [NOT] NULL 和 DEFAULT [value]只能列级约束
意味着表级约束基本就用在FOREIGN外键约束和UNIQUE CHECK上了 (好菜啊)
不过由于MySQL不支持列级约束起别名 因此 表级有个好处就是可以有约束名(键的名字)这个下一节详细讲一下2333
注意 MYSQL 不 支持CHECK 属性 SQLite oracle支持
虽然不报错 但是没效果
问题: 不支持check该怎么办?
回答:一般check可以用ENUM 代替
还记得前面数据类型的 枚举类型(enumerate) 嘛(C语言 也有的哦 算法里面枚举暴力 了解一下)我们用那个就能达到目的了
意味着 MySQL里面 相对于列级 表级真的挺废的2333。
彩蛋
其实列级也是有外键约束的
问题是MySQL不支持 而SQLite 和 oracle等支持
但个人觉得不用纠结 反正你看得懂别人代码
自己写代码 掌握一种方法就好 其实没有太大性能差异的
总结 ´◡`
这一节在上一节的基础上 讲了讲约束 结合上一节的数据类型讲解 相信我们可以在创建表格的时候 可以更加根据自己的需要修饰 列属性
列级约束 表级约束
其实不用纠结名字了 反正只有两种添加约束的语法
第一种 叫列级约束
MySQL支持 除了外键以外所有的约束 叠加关键词即可
SQLite oracle支持外键约束 意外着表级约束失去了意义
第二种 叫表级约束
支持外键约束 UNQIUE 可以多选几列来管理约束
只不过
一般 栏目数少的情况下 表级语法就用外键就行了 其他用列级即可
当然UNIQUE属性多了也可以用表级
下一节还是需要继续学习一下的 约束的知识还没有讲完:)
下一站:数据库学习之MySQL (二十六)—— DDL(四)约束 - 主键 外键详解 添加约束 删除约束 修改约束
另外,
-
想系统的学习数据库嘛?
MySQL专栏 -
python这么火 想要深入学习python 玩一下简单的应用嘛?可以看我专栏 还在持续更新中哦:
python应用 -
小孩子才做选择 大人全都要!对后端感兴趣吗?收下它吧:)
手把手带你学后端(服务端) -
谢谢大佬支持! 萌新有礼了:)