数据库---Day6 数据库约束

张开发
2026/4/7 5:11:09 15 分钟阅读

分享文章

数据库---Day6 数据库约束
本系列可作为数据库学习系列的笔记文中提到的一些练习的代码小编会将代码复制下来大家复制下来就可以练习了方便大家学习。点赞关注不迷路您的点赞、关注和收藏是对小编最大的支持和鼓励系列文章目录JAVA初阶---------已更完JAVA数据结构---------已更完数据库---Day 1 数据库基础数据库---Day2 数据库操作数据库---Day3 数据类型数据库---Day4 数据表的操作数据库---Day5 数据表的增删改查数据库---Day6 数据库约束数据库---Day7 数据表设计目录目录系列文章目录目录前言0. 本节学习目标1. 什么是数据库约束2. 六大约束类型总览完整版对照表3. NOT NULL 非空约束超详细3.1 作用3.2 无约束时的问题数据不完整3.3 添加非空约束3.4 插入 NULL 报错3.5 正常插入3.6 查看非空约束4. DEFAULT 默认约束超详细4.1 作用4.2 无默认约束时4.3 添加默认约束4.4 不指定 age → 自动用默认值4.5 手动赋 NULL → 依然是 NULL4.6 查看默认约束5. UNIQUE 唯一约束超详细5.1 作用5.2 无唯一约束 → 可重复5.3 添加唯一约束5.4 插入重复值 → 报错5.5 查看唯一约束6. PRIMARY KEY 主键约束最重点6.1 主键是什么6.2 主键三大规则6.3 单列主键最常用6.4 主键 自增 AUTO_INCREMENT6.5 自增主键插入6.6 自增细节6.7 主键冲突处理高级用法6.7.1 存在则更新ON DUPLICATE KEY UPDATE6.7.2 存在则替换REPLACE6.8 复合主键多列联合7. FOREIGN KEY 外键约束表关系核心7.1 外键作用7.2 核心概念7.3 步骤 1创建主表班级7.4 步骤 2创建从表学生 外键7.5 查看外键7.6 外键约束规则必背7.7 插入不存在的班级 → 报错7.8 删除被引用班级 → 报错7.9 删除表顺序8. CHECK 约束自定义数据规则8.1 说明8.2 学生表 CHECK 示例8.3 违反 CHECK → 报错8.4 跨列比较 CHECK9. 全套约束高频面试题背会稳过10. 全文总结极简记忆版总结前言小编作为新晋码农一枚会定期整理一些写的比较好的代码作为自己的学习笔记会试着做一下批注和补充如转载或者参考他人文献会标明出处非商用如有侵权会删改欢迎大家斧正和讨论0. 本节学习目标掌握约束的使用场景掌握以下 6 种约束的创建与使用NOT NULL 非空约束DEFAULT 默认约束UNIQUE 唯一约束PRIMARY KEY 主键约束FOREIGN KEY 外键约束CHECK 约束1. 什么是数据库约束数据库约束对数据库表中的数据施加的强制规则 / 条件。作用确保数据准确、可靠、完整、一致从数据库层面拦截非法数据。数据库约束是数据库的一个重要功能主要作用是保证数据的完整性也可能理解数据的正确性数据本身是否正确关联关系是否正确。人工检查数据完整性的工作量非常大在数据表中定义一些约束那么数据库写入数据的时候数据库会帮我们做校验工作。约束一般是指定在列上的约束可以基于数据是否为空值是否唯一默认值关联关系自定义值范围一句话约束 数据库的守门员。2. 六大约束类型总览完整版对照表约束名称关键字核心作用特点非空约束NOT NULL列不能存储 NULL保证关键字段必须有值默认约束DEFAULT未赋值时自动填充默认值手动写 NULL 仍为 NULL唯一约束UNIQUE列值不能重复允许多个 NULL主键约束PRIMARY KEY唯一标识表中每一行非空 唯一一张表只能一个外键约束FOREIGN KEY建立两表关联关系保证引用完整性CHECK 约束CHECK限制值的范围 / 规则MySQL 8.0.16 真正生效3. NOT NULL 非空约束超详细3.1 作用指定列不允许为 NULL保证数据完整性。例如学生姓名、用户名、手机号不应该为 NULL。没有指定非空约束时当前的列是可以写入一个NULL值的如果要把某一列定义为一个必填项那么就可以使用not null非空约束。3.2 无约束时的问题数据不完整DROP TABLE IF EXISTS student; CREATE TABLE student( id BIGINT, name VARCHAR(20) ); -- 可以插入 NULL数据无意义 INSERT INTO student VALUES (1, NULL); SELECT * FROM student; -- 结果name 为 NULL记录不完整NO 表示当前列不能为空 YES表示当前列可以为空。如果此时插入数据时id为空会显示报错提示不能写入null值数据库帮我们做了一次校验。insert into student values (NULL,张三);当我们的id修改后可以正常插入。3.3 添加非空约束DROP TABLE IF EXISTS student; CREATE TABLE student ( id BIGINT, name VARCHAR(20) NOT NULL -- 非空约束 );3.4 插入 NULL 报错INSERT INTO student VALUES (1, NULL);报错信息ERROR 1048 (23000): Column name cannot be null3.5 正常插入INSERT INTO student VALUES (1, 张三);3.6 查看非空约束DESC student;查看规则Null列显示NO→ 不允许 NULLNull列显示YES→ 允许 NULL4. DEFAULT 默认约束超详细4.1 作用插入数据时没有给列赋值自动使用默认值。注意手动明确写 NULL依然是 NULL。4.2 无默认约束时DROP TABLE student; CREATE TABLE student ( id BIGINT, name VARCHAR(20) NOT NULL, age INT ); INSERT INTO student(id, name) VALUES (1, 张三); -- age 为 NULL4.3 添加默认约束DROP TABLE student; CREATE TABLE student ( id BIGINT, name VARCHAR(20) NOT NULL, age INT DEFAULT 18 -- 默认 18 岁 );4.4 不指定 age → 自动用默认值INSERT INTO student(id, name) VALUES (1, 张三); -- age 184.5 手动赋 NULL → 依然是 NULLINSERT INTO student(id, name, age) VALUES (2, 李四, NULL); -- age NULL4.6 查看默认约束DESC student;Default列会显示默认值。5. UNIQUE 唯一约束超详细5.1 作用列的值必须唯一不能重复。适用场景身份证号、学号、工号、手机号。5.2 无唯一约束 → 可重复DROP TABLE student; CREATE TABLE student ( id BIGINT, name VARCHAR(20) NOT NULL, age INT DEFAULT 18, sno VARCHAR(10) ); INSERT INTO student(id, name, sno) VALUES (1, 张三, 100001); INSERT INTO student(id, name, sno) VALUES (2, 李四, 100001); -- 重复学号依然成功5.3 添加唯一约束DROP TABLE student; CREATE TABLE student ( id BIGINT, name VARCHAR(20) NOT NULL, age INT DEFAULT 18, sno VARCHAR(10) UNIQUE -- 唯一约束 );5.4 插入重复值 → 报错INSERT INTO student(id, name, sno) VALUES (1, 张三, 100001); INSERT INTO student(id, name, sno) VALUES (2, 李四, 100001);报错ERROR 1062 (23000): Duplicate entry 100001 for key student.sno5.5 查看唯一约束DESC student;Key列显示UNI→ 唯一约束。6. PRIMARY KEY 主键约束最重点6.1 主键是什么主键 NOT NULL UNIQUE作用唯一标识表中的每一条记录。6.2 主键三大规则必须非空、唯一一张表只能有一个主键可以是单列或多列复合主键6.3 单列主键最常用DROP TABLE IF EXISTS student; CREATE TABLE student ( id BIGINT NOT NULL UNIQUE, name VARCHAR(20) NOT NULL, age INT DEFAULT 18, sno VARCHAR(10) UNIQUE );DESC student;→Key列显示PRI。6.4 主键 自增 AUTO_INCREMENT开发标准写法DROP TABLE IF EXISTS student; CREATE TABLE student ( id BIGINT PRIMARY KEY AUTO_INCREMENT, -- 自增主键 name VARCHAR(20) NOT NULL, age INT DEFAULT 18, sno VARCHAR(10) UNIQUE );6.5 自增主键插入表示在当前表中上一条记录的基础上加1desc student; insert into student VALUES (NULL,张三,18,2020060845); insert into student VALUES (NULL,李四,18,2020060846); SELECT * from student;让数据库帮我们维护主键的增长不用程序员自己去计算了在插入的时候先找到最大的值然后在这个基础上加1生成一个新的值做为新一个数据行主键id列的值当设置了自增主键是发现了写入null时也可以成功的插入数据这里并不是说把这个NULL写入数据库了而是说让数据库帮我们处理这个键的值。当id值指定为100也是可以的只要主键值不重复即可。当再次插入时找到ID最大的值是1001所以下一个值是101.6.6 自增细节插入失败自增值会作废不回滚手动指定大 id下次自增从最大值开始主键值可以不连续6.7 主键冲突处理高级用法6.7.1 存在则更新ON DUPLICATE KEY UPDATEINSERT INTO student(id,name,sno) VALUES (100,赵六,100100) ON DUPLICATE KEY UPDATE name赵六, sno100100;6.7.2 存在则替换REPLACEREPLACE INTO student(id,name,sno) VALUES (101,钱七,100101);6.8 复合主键多列联合DROP TABLE IF EXISTS student; CREATE TABLE student ( id BIGINT, name VARCHAR(20), PRIMARY KEY (id, name) -- 联合主键 );规则两列组合不能重复。一个表中不允许有两个主键一个主键可包含多个列符合主键此时KEY列中出现了两个PRI表示当前表定义了复合主键在唯一校验时只有复合主键中所有的列都相同才被判定为相同。编号相同但是名字不同也可以插入。7. FOREIGN KEY 外键约束表关系核心7.1 外键作用定义两个表之间的关联关系保证引用完整性。表中某个列的值必须是别一张表中的主键列或是唯一约束列的值也就是当前表中的值在另一张表中必须存在且满足主键或唯一约束。7.2 核心概念主表被引用的表如班级表 class从表使用外键的表如学生表 student外键列必须引用主表的主键或唯一键7.3 步骤 1创建主表班级DROP TABLE IF EXISTS class; CREATE TABLE class ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL ); INSERT INTO class(name) VALUES (java01),(java02),(java03),(C01),(C02);7.4 步骤 2创建从表学生 外键DROP TABLE IF EXISTS student; CREATE TABLE student( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, age INT DEFAULT 18, class_id BIGINT, FOREIGN KEY (class_id) REFERENCES class(id) -- 外键 );7.5 查看外键DESC student;Key列显示MUL→ 外键。7.6 外键约束规则必背从表插入的class_id必须在主表存在否则失败外键可以为 NULL表示未分配主表记录被从表引用时不能删除删表必须先删从表再删主表7.7 插入不存在的班级 → 报错INSERT INTO student(name, class_id) VALUES (王五, 100);报错ERROR 1452 (23000): Cannot add or update a child row7.8 删除被引用班级 → 报错DELETE FROM class WHERE namejava01;7.9 删除表顺序DROP TABLE student; -- 先删从表 DROP TABLE class; -- 再删主表8. CHECK 约束自定义数据规则8.1 说明MySQL8.0.16 版本开始才真正支持低版本会忽略。作用自定义列的值范围、条件、规则。8.2 学生表 CHECK 示例DROP TABLE IF EXISTS student; CREATE TABLE student( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, age INT DEFAULT 18, gender CHAR(1), CHECK (age 16), -- 年龄 ≥16 CHECK (gender IN (男,女)) -- 性别只能男/女 );8.3 违反 CHECK → 报错-- 年龄太小 INSERT INTO student(name,age,gender) VALUES (张三,15,男); -- 性别非法 INSERT INTO student(name,age,gender) VALUES (张三,17,1);报错ERROR 3819 (HY000): Check constraint violated8.4 跨列比较 CHECKCREATE TABLE t_check ( c1 INT CHECK(c1 0), c2 INT CHECK(c2 0), c3 INT, CHECK(c3 c2) -- 列之间比较 );9. 全套约束高频面试题背会稳过主键和唯一约束的区别主键非空唯一允许 NULL一张表只能一个主键可多个唯一自增主键不连续正常吗正常失败 / 回滚会占用自增值外键有什么用保证引用完整性防止脏数据MySQL 什么时候 CHECK 生效8.0.16 及以上默认约束和 NULL 的关系不赋值用默认手动写 NULL 还是 NULL复合主键是什么多列联合作为主键组合不可重复10. 全文总结极简记忆版NOT NULL不许为空DEFAULT不赋值用默认UNIQUE不许重复PRIMARY KEY非空 唯一表的唯一标识FOREIGN KEY表关联保证引用合法CHECK自定义规则8.0.16 生效所有约束都是为了一件事让数据库数据更干净、更可靠。总结以上就是今天要讲的内容本文简单记录了数据库学习内容仅作为一份简单的笔记使用大家根据注释理解您的点赞关注收藏就是对小编最大的鼓励

更多文章