MySQL约束那些事(超级详细,附带代码解析)
约束
1、约束概述
1.1 为什么需要约束
数据完整性是指数据的精确性和可靠性。它是防止数据库中存在不符合语义规定的数据和防止错误信息的输入输出造成无效操作或错误信息而提出的。
为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制。从以下四个方面考虑:
- 实体完整性:例如,同一个表中,不能存在两条完全相同无法区分的记录
- 域完整性:例如,年龄范围是0~120,性别范围是男/女
- 引用完整性:例如:员工所在部门,在部门表中要能找到这个部门
- 用户自定义完整性:例如:用户名唯一、密码不能为空等,本部门经理的工资不能高于本部门职工的平均工资的5倍
1.2 什么是约束
约束是表级的强制规定。对表中字段的限制。
1.3 约束的分类
角度1:约束的字段的个数
- 单列约束
- 多列约束
角度2:约束的作用范围
- 列级约束:将此约束声明在对应的字段的后面
- 表级约束:在表中所有字段都声明完,在所有字段的后面声明的约束
角度3:约束的作用(或功能)
- not null(非空约束)
- unique(唯一性约束)
- primary key(主键约束)
- foreign key(外键约束)
- check(检查约束)
- default (默认值约束)
1.4 如何添加/删除约束?
CREATE TABLE时添加约束
ALTER TABLE时增加约束、删除约束。
2、如何查看表中的约束
# 如何查看表中的约束
SELECT * FROM information_schema.`TABLE_CONSTRAINTS` WHERE table_name = '表名称';
2、非空约束
2.1 作用
限定某个字段/某列的值不允许为空
2.2 关键字
NOT NULL
2.3 特点
- 默认,所有的类型的值都可以为NULL,包括INT,FLOAT等数据类型
- 非空约束只能出现在表独享的列上,只能某个列单独限定非空,不能组合非空
- 一个表可以有很多列都分别限定了非空
- 空字符串 不等于NULL,0也不等于NULL
2.4 添加非空约束
(1)建表时:
CREATE TABLE 表名称(字段名 数据类型,字段名 数据类型 NOT NULL,字段名 数据类型 NOT NULL
);
举例:
CREATE TABLE test1(id INT NOT NULL,last_name VARCHAR(15) NOT NULL,email VARCHAR(25),salary DECIMAL(10,2)
);
DESC test1;
(2)在ALTER TABLE时添加约束
# 3.2在ALTER TABLE时添加约束
ALTER TABLE test1
MODIFY email VARCHAR(25) NOT NULL;
(3)在ALTER TABLE时删除约束
ALTER TABLE test1
MODIFY email VARCHAR(25) NULL;
3、唯一性约束
3.1 作用
用来限制某个字段/某列的值不能重复。
3.2 关键字
UNIQUE
3.3 特点
- 同一个表中可以有多个唯一约束
- 唯一约束可以是某一个列的值是唯一
- 唯一性约束运行值为空
- 在创建唯一的约束时,如果不给他唯一约束命名,就默认和列名相同
- MySQL会给唯一约束的列上默认创建一个唯一索引。
3.4添加唯一约束
(1)建表时:在CREATE TABLE时添加约束
CREATE TABLE test2(id INT UNIQUE, # 列级约束last_name VARCHAR(15),email VARCHAR(25),salary DECIMAL(10,2),# 表级约束CONSTRAINT uk_test2_email UNIQUE(email)
);
在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
可以向声明为unique的字段上添加NULL值,而且可以多次添加NULL值
(2)在ALTER TABLE时添加约束
# 字段列表中如果是一个字段,表示该列的值是唯一。如果是两个或更多个字段,那么复合唯一,即多个字段的组合是唯一的
# 方式1:
ALTER TABLE 表名称 ADD UNIQUE KEY(字段列表);
# 方式2:
ALTER TABLE 表名称 MODIFY 字段名 字段类型 UNIQUE;
(3)复合的唯一性约束
CREATE TABLE USER(id INT,`name` VARCHAR(15),`password` VARCHAR(25),#表级约束CONSTRAINT uk_user_name_pwd UNIQUE(`name`,`password`));
SELECT * FROM USER;
INSERT INTO USER VALUES(1,'TOM','ABC');
INSERT INTO USER VALUES(2,'Jerry','ABC');
(4) 删除唯一性约束
添加唯一性约束的列上也会自动创建唯一索引
删除唯一约束只能通过删除唯一索引的方式删除
删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样
如果创建唯一约束是未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么就默认和()中排第一位的列名相同
ALTER TABLE 表名 DROP INDEX 索引名;
4、PRIMARY KEY约束
4.1作用
用来唯一标识表中的一行记录
4.2 关键字
primary key
4.3 特点
- 主键约束相当于唯一约束+ 非空约束的集合,主键约束列不允许重复,也不允许出现空值。
- 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
- 主键约束对应着表中的一列或者多列(复合主键)。
- 如果是多列组合的符合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
- MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
- 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
- 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。
4.4 添加主键约束
(1)建表时指定主键约束
CREATE TABLE 表名称(字段名称 数据类型 PRIMARY KEY, #列级模式字段名称 数据类型
);CREATE TABLE test3(id INT PRIMARY KEY,last_name VARCHAR(25),salary DECIMAL(10,2),email VARCHAR(25));
(2)在ALTER TABLE时添加主键约束
ALTER TABLE test4 ADD PRIMARY KEY(id);
(3)删除主键约束
ALTER TABLE 表名称 DROP PRIMARY KEY;
# 说明:删除主键约束,不需要指定朱建明,因为一个表只有一个主键,删除主键约束后,非空还存在。
5、自增列:AUTO_INCREMENT
5.1作用
某个字段的自增
5.2 关键字
auto_increment
5.3 特点和要求
- 一个表最多只能有一个自增长列
- 当需要产生唯一标识符或顺序值时,可设置自增长
- 自增长列约束的列必须是键列(主键列,唯一键列)
- 自增约束的列的数据类型必须是整数类型
- 如果自增列指定了0和NULL,会在当前最大值的基础上自增,如果自增列手动指定了具体值,直接赋值为具体值。
5.4 如何指定自增约束
CREATE TABLE test7(id INT PRIMARY KEY AUTO_INCREMENT,last_name VARCHAR(15)
)
6、FOREIGN KEY约束
6.1 作用
限定某个表的某个字段的引用完整性
比如:员工表的员工所在部门的选择,必须在部门表能够找到对应的部分。、
6.2 关键字
foreign key
6.3 主表和从表/父表和子表
主表(父表):被引用的表,被参考的表
从表(子表):引用别人的表,参考别人的表
6.4 特点
(1)从表的外键列,必须引用/参考主表的键主键或唯一约束的列
为什么?因为被依赖/被参考的值必须是唯一的
(2)在创建外键约束时,如果不给外键约束命名。默认名不是列名,而是自动产生一个外键名,也可以指定外键约束名
(3)创建表时就指定外键约束的话,先创建主表,再创建从表
(4)删表时,先删从表,再删主表
(5)当主表的记录被从表参考时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据
(6)在“从表”中指定外键约束,并且一个表可以建立多个外键约束
(7)从表的外键列与主表被参考的列名字可以不相同,但是数据类型必须一样,逻辑意义一致。如果类型不一样,创建子表时,就会出现错误。
(8)当创建外键约束时,系统默认会在所在的列上建立对应的普通索引,但是索引名不是列名,不是外键的约束名。(根据外键查询效率更高)
(9)删除外键约束后,必须手动删除对应的索引
添加外键约束
(1)建表时
# 7、foreign key(外键约束)
# 7.1 CREATE TABLE
# 主表和从表:父表和子表
# 先创建主表
CREATE TABLE dept1(dept_id INT,dept_name VARCHAR(15)
);
ALTER TABLE dept1 ADD PRIMARY KEY(dept_id);
# 再创建从表
CREATE TABLE emp1(emp_id INT PRIMARY KEY AUTO_INCREMENT,emp_name VARCHAR(15),departmenmt_id INT,# 表级约束CONSTRAINT fk_emp1_dept_id FOREIGN KEY(departmenmt_id) REFERENCES dept1(dept_id)
);#演示外键的效果
INSERT INTO dept1 VALUES(10, 'IT');
INSERT INTO emp1 VALUES(10001,'TOM',10)
6.7 约束等级
- Cascade方式:在父表上update/delete记录时,同步update/delete掉子表的匹配记录
- Set null方式:在父表盘上update/delete记录时,将子表上匹配记录的列设为null,但是需要注意子表的外键列不能为not null
- No action方式:如果子表有匹配的记录,则不允许对父表对应候选键进行update/delete操作
- Restrict方式:同no action,都是立即检测外键约束
- Set default方式(在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别
如果没有指定等级,就相当于Restrict方式
对于外键约束,最好是采用 ON UPDATE CASCADE ON DELETE RESTRICT的方式。
6.8 删除外键约束
(1)第一步先查看约束名和删除外键约束
SELECT * FROM information_schema.`TABLE_CONSTRAINTS` WHERE table_name = '表名称';
ALTER TABLE 从表名 DROP FOREIGN KEY 外键约束名;
(2)第二步查看索引名和删除索引(注意,只能手动删除)
SHOW INDEX FROM 表名称; # 查看某个表的索引名
ALTER TABLE 从表名 DROP INDEX 索引名;
6.9 开发场景
问题1:如果两个表之间有关系(一对一、一对多),比如:员工表和部门,他们之间是否一定要建立外键约束?
不是的
问题2:建和不建外键约束有什么区别?
建外键约束,你的操作(创建表、删除表、增删改)会受到限制
不建外键约束,你的操作(创建表、删除表、增删改)会受到限制
外键与级联更适用于单机地并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度、
7、CHECK约束
7.1 作用
检查某个字段的值是否符合xx要求,一般是指值的范围
7.2 关键字
CHECK
7.3 说明:MySQL5.7不支持
但是MySQL8.0支持
# CHECK约束
CREATE TABLE test10(id INT,last_name VARCHAR(15),salary DECIMAL(10,2) CHECK(salary > 2000)
);
# 报错 :Check constraint 'test10_chk_1' is violated.
INSERT INTO test10(id,last_name, salary) VALUES(1,'Tom',250);
# 正确:
INSERT INTO test10(id,last_name, salary) VALUES(1,'Tom',2500);
SELECT * FROM test10;
MySQL约束那些事(超级详细,附带代码解析)相关推荐
- debian部署mysql和tomcat_【超级详细】在Debian/kali/linux服务器下搭建Tomcat7+mysql+jdk8环境...
JDK安装 Tomcat安装 MySQL安装 [JDK安装] 1.首先下载一个JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downlo ...
- uniapp - 编译微信小程序项目的微信授权登录、获取微信手机号登录、最新版微信直接登录、手机与验证码登录的示例源码(适用于 uniapp 微信小程序项目,源代码直接开箱即用)超级详细的代码及注释
效果图 uniapp 项目编译微信小程序,一些常见的登录方式及源代码,示例代码干净整洁无BUG拿来即用. 本文示例实现了 uniapp 微信小程序项目的登录功能,包含微信授权登录.获取微信手机号登录. ...
- noip2007守望者的逃离(超级详细,逐步解析)
目录 归纳条件 分析思路 主要思路 dp 设变量部分 主函数部分 完整AC代码 总结 先看题目 试题描述 恶魔猎手尤迫安野心勃勃.他背叛了暗夜精灵,率深藏在海底的那加企图叛变:守望者在与尤迪安的交锋 ...
- 超级详细树讲解三 —— B树、B+树图解+代码
首先很高兴你看到了这篇文章,这篇文章可能会花费你很长很长的时间去看,但是这篇文章包括的内容绝对足够你对树的一个系统性的学习.为什么要写这篇文字呢?因为自己在学习树的时候,有些博客只有图解,有些博客只有 ...
- 超级详细的解决方法 (CentOS7) :永久修改 mysql read-only 问题 could not retrieve transation read-only status server
超级详细的解决方法 (CentOS7) :永久修改 mysql read-only 问题 could not retrieve transation read-only status server 参 ...
- asp连接mysql视频_asp连接mysql数据库详细实现代码
ASP 的 asp连接mysql数据库详细实现代码 想要asp能连接mysql数据库需要安装MySQL ODBC 3.51 驱动 我们先看下面这段代码 代码如下: set conn = server. ...
- MySQL数据库安装-Windows10为例【超级详细安装过程(每一步的截图)、检测安装是否成功、登录数据库并查看版本号、将MySQL添加到环境变量中、在命令行窗口操作数据库】
哈哈,这是在哔哩哔哩网站上 看的 MySQL安装步骤. 我安装的时候,截截图,希望对大家 有所帮助. 链接:https://pan.baidu.com/s/1fKFQCVHMQOmbg84UyGrKB ...
- 超级详细备注的代码:Python帮助您高效通过英语六级考试
超级详细备注的代码:Python帮助您高效通过各种英语考试 标题:限时免费|领取大学英语六级考试葵花宝典 联系小编,获取源码和30份六级真题. # -*- coding:utf-8 -*-#作者:公众 ...
- MySQL+Navicat安装配置教程(超级详细、保姆级)
MySQL+Navicat安装配置教程(超级详细.保姆级) 一. 下载MySQL 1. 选择想要安装的版本,点击Download下载 二.安装MySQL 1. 选择设置类型 2. 选择安装的产品和功能 ...
最新文章
- 先本地仓库中国添加jar包
- 得到鹅厂最新前端开发手册一份
- 如何在 .NET 中使用 Kafka
- Python-strace命令追踪ssh操作
- SQL Server :理解数据记录结构
- 大数据之_Hadoop工作笔记001---Hadoop3.1.2在Centos7上安装_单机版
- 奶茶店收银系统php版,奶茶店收银系统
- 解决360N4S骁龙版在国外使用碰到的问题,附详细root教程
- Git的安装步骤、配置(解决Git官网下载速度慢、无法下载,需要授权)
- HDU---2037
- 反编译工具的安装与使用(解决部分能反编译部分不能反编译)
- AS400 资料并分享面经一
- Smart210学习记录-------内存初始化
- windows通过资源管理器访问服务器(samba服务),您需要权限来执行此操作
- 如何给PDF删除空白页面?来看看这种方法
- 手把手教你如何写一个三子棋/N子棋的小游戏
- idea java: 错误: 不支持发行版本 17
- vlan配置实例详解_网工知识角|MUXVLAN技术详解,基本原理一篇搞定
- gochat源码解析
- 【Android】之【WebView】
热门文章
- signature=d208b1bb0cb69ace8714b67c8fb41881,The mechanics of cemented carbonate sands.
- 关于测试环境部署的那些事儿
- 基于51单片机霍尔测速仪表测转速调速系统方案原理图设计
- 亏损同比超90%,巴菲特看中的snowflake首份业绩单为何难看?
- linux yum安装iscsi,CentOS 安装配置iscsi共享存储
- 20220512之脑壳疼
- UFT12无限期试用
- wifi信号增强android,wifi信号增强器下载安装
- 谷歌浏览器已屏蔽相应权限以保护您的隐私
- 消除卡顿 mac MATLAB2022b m1/m2原生下载安装 教程