数据库学习之MySQL (二十五)—— DDL(三)约束 - 列级约束 表级约束 语法

MySQL学习专栏 正在持续更新中:)

前言 ´・ᴗ・`

  • 本篇内容将会帮助你学习几乎所有数据库用到的约束类型

约束(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 [约束名] 是用来命名约束的 这个会后面会用到的
意味着你可以这么写 便于理解 (虽然实际中不推荐):

扫描二维码关注公众号,回复: 9090658 查看本文章
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应用

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

  • 谢谢大佬支持! 萌新有礼了:)
    在这里插入图片描述

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

猜你喜欢

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