当前位置: 首页 > article >正文

Mysql学习笔记之约束

1.简介

MySQL中的约束用于定义表中数据的规则,以确保数据的准确性和完整性。以保证数据表中数据的有效性、正确性和完整性。

2.约束分类

在mysql中约束分类如下:

约束说明关键字
主键约束每个表只能有一个主键;主键的值必须唯一,不能为NULL;主键用于唯一标识表中的每一行记录。PRIMARY KEY
唯一约束保证列中的所有值都是唯一的;可以有多个唯一约束;唯一约束列可以包含NULL值。UNIQUE
非空约束确保列中的值不能为NULL;可以有多个非空约束。NOT NULL
默认约束当没有为列指定值时,将使用默认值。DEFAULT
检查约束保证字段值满足某一个条件(早期版本不支持)。CHECK
外键约束用来让两张表的数据之间建立连接,保证数据的一致性和完整性;外键包含的列必须在另外一张表中作为主键或者唯一键存在。FOREIGN KEY

3.实例

在前面章节建立student表时,并没有进行约束限制,建表语句如下:

CREATE TABLE `students`  (
  `id` int COMMENT '学号',
  `name` varchar(255) COMMENT '姓名',
  `sex` varchar(2) COMMENT '性别',
  `age` int COMMENT '年龄'
)COMMENT '学生表';

在学生表中,每个学生的学号应该是唯一且不为空的,因此可以将id设为主键,而每个学生应该都有名字,因此name必须是非空的,但名字可以重复,所以不能设置为唯一,性别除了‘男’就是‘女’,可以设置检查约束来确保字段的正确性,同理年龄也应该是非空限制。
加上约束后的建表语句如下:

CREATE TABLE `students`  (
  `id` int PRIMARY KEY COMMENT '学号' ,
  `name` varchar(255) NOT NULL COMMENT '姓名',
  `sex` varchar(2) CHECK(sex IN('男','女')) COMMENT '性别',
  `age` int NOT NULL COMMENT '年龄'
) COMMENT '学生表';

接下来尝试插入一些错误的数据,看约束是否生效

  • 验证主键
    前面提到主键是不能为空,且唯一的,因此可以从两方面验证主键是否生效
-- 主键留空
INSERT INTO students (id,`name`,sex,age) VALUES(NULL,"张三","男",20);

提示id不能为空
在这里插入图片描述

-- 插入相同的主键
INSERT INTO students (id,`name`,sex,age) VALUES(1,"张三","男",20);
INSERT INTO students (id,`name`,sex,age) VALUES(1,"李四","男",20);

提示主键重复
在这里插入图片描述

  • 验证非空
    将名称或者年龄任意字段留空
-- 名称留空
INSERT INTO students (id,`name`,sex,age) VALUES(2,NULL,"男",20);

在这里插入图片描述
注意
NULL和空字符串不等 NOT NULL 不能限制空字符串,如果需要限制空字符串需要使用检查约束(CHECK)进行限制

  • 验证检查约束
    对性别字段插入除(男,女)外的别的字符
INSERT INTO students (id,`name`,sex,age) VALUES(2,"李四","你",20);

检查不通过
在这里插入图片描述

4.外键

外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
语法:

  • 添加外键
CREATE TABLE 表名(
字段名 数据类型,
...
[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) 删除/更新行为
);
-- 或者
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) 删除/更新行为;
  • 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

4.1 删除/更新行为

添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。主要有以下几种:

行为说明
NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 RESTRICT 一致) 默认行为
RESTRICT当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 NO ACTION一致) 默认行为
CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
SET NULL当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)。
SET DEFAULT父表有变更时,子表将外键列设置成一个默认的值 (Innodb不支持)

4.2 实例

先准备两张表
1.班级表(class)
在这里插入图片描述
2.学生表(students)
在这里插入图片描述

  1. NO ACTION(RESTRICT)
    首先将学生表中classid设置为外键,管理class表的id字段(使用默认删除/更新行为)
ALTER TABLE students  ADD CONSTRAINT fk_classIs FOREIGN KEY (classid) REFERENCES class (id);

删除id为1的班级,提示错误,存在外键引用不能删除
在这里插入图片描述
2. CASCADE

ALTER TABLE students  ADD CONSTRAINT fk_classIs FOREIGN KEY (classid) REFERENCES class (id) on update cascade on delete cascade ;

原始数据
在这里插入图片描述
将id为3的班级设置为id为4
在这里插入图片描述
在这里插入图片描述
3. SET NULL

ALTER TABLE students  ADD CONSTRAINT fk_classIs FOREIGN KEY (classid) REFERENCES class (id) on update SET NULL on delete SET NULL;

删除id为4的班级信息

DELETE FROM class WHERE id = 4;

在这里插入图片描述

4.3 拓展

从上述删除/更新行为可以看出,外键的存在会导致数据表在插入、删除、更新数据时,都会先验证该记录是否存在外键,因此会带来额外的操作从而影响性能。所以外键的使用需要根据实际场景慎重考虑。


http://www.kler.cn/a/463360.html

相关文章:

  • JavaScript系列(4)--数值类型专题
  • 【开源社区openEuler实践】hpcrunner
  • dockerignore文件怎么写
  • 树莓派 Pico RP2040 教程点灯 双核编程案例
  • NLP 复习大纲
  • 项目:停车场车辆管理系统
  • 网络安全课程
  • JVM学习:CMS和G1收集器浅析
  • PHP Fatal error: Uncaught com_exception: Source:Kingsoft WPS Description:文档打开失败
  • 【AI日记】25.01.01 秦制两千年
  • ubuntu20.04 中文输入法安装
  • nginx-负载均衡
  • 微信小程序BackgroundAudioManager使用中的问题
  • 【每日学点鸿蒙知识】文字识别、快捷登录、输入法按钮监听、IDE自动换行、资产访问等
  • Git 入门(一)
  • 什么是 Spring 的组件(Bean)
  • C#如何操作数据库
  • HTML——48. div标签
  • ubuntu初始配置
  • 基于神经网络的车牌识别算法matlab仿真 人工智能方法 车牌识别
  • MySQL初始安装登录:ERROR 2003 (HY000): Can‘t connect to MySQL server on
  • OpenCV中VideoCapture的各种用法
  • 慎用翼讯科技服务器以及不知名服务器的说明
  • 手机实时提取SIM卡打电话的信令声音-双卡手机来电如何获取哪一个卡的来电
  • Vue2: 创建一个可多选的Table,并回显数据选中状态
  • 华为配置 之 链路聚合