MySQL 6:数据库约束

1.概念与类型

概念: 数据库约束是指对数据库表中的数据 所施加的规则或条件 ,用于确保数据的准确性和可靠性 。这些约束可以是基于数据类型、值范围、唯一性、非空等 规则,以确保数据的正确性和相容性。


约束类型

2.NOT NULL 非空约束

定义表时某列不允许为NULL时,可以为列添加非空约束。

对于明确不会为空的列,建议主动添加该约束,这不仅保障 数据完整性,也能优化查询效率。

举例:创建一个学生表,约束学生名的列不能为NULL。

• 为所有列添加非空约束

• 由于name列有非空约束,插入NULL值时报错。

• 正常值可以成功插入

sql 复制代码
drop table if exists student;

create table student(
 id bigint,
 name varchar(20) not null
);

NULL列为NO表示值不允许为NULL ,YES表示值可以为NULL。

• 查看表结构,name列的 Null 属性值 为NO。


3.DEFALUT 默认值约束

DEFAULT 约束用于向列中插入默认值 ,如果没有为列设置值 ,那么会将默认值设置到该列。

举例:为年龄 列加入默认值

• 重构 学生表,新增年龄列, 为年龄列加入默认约束。

• 插入一条记录,不指定年龄的值时列使用了默认值 (若没有设置默认约束 时会为NULL )。

sql 复制代码
drop table student;

create table student (
 id bigint,
 name varchar(20) not null,
 age int default 18
);

• 查看表结构 ,age****列 的 Default 属性值 为18。


4.UNIQUE 唯一约束

指定了唯一约束的列 ,该列的值在所有记录中不能重复 ,比如⼀个人的身份证号 ,学生的学号等。

对于明确是唯一的列,建议主动添加该约束,这不仅保障 数据完整性,也能优化查询效率。

注意: 唯一约束只确保非 NULL 值的唯一性 ,通常允许存在多个 NULL 值。

举例:设置学号唯一

• 重构 学生表,新增学号列并设置唯一约束。

• 插入重复的学号时报错 ,唯一 约束生效。

sql 复制代码
drop table student;

create table student (
 id bigint,
 name varchar(20) not null,
 age int default 18,
 sno varchar(10) unique
);

• 查看表结构 ,sno列的 Key 属性值为UNI, 表示该学号列 已成功添加唯一约束 。


5.PRIMARY KEY 主键约束

5.1 定义



5.2 示例

举例:将学生表的id 列 设为主键

• 重构 学生表,为id 列 添加主键约束。

• 查看表结构, id列的 Key 属性值 为PRI ,表示 id 已被成功 设为主键。

sql 复制代码
drop table student;

create table student (
 id bigint primary key,
 name varchar(20) 
);

• 当Id列的重复时 会发生主键冲突



通常把主键列 设置为自动增长 ,让数据库维护主键值 ,一个表 中只能有一个自增列。

• 重构 学生表,将学生表的id 列 设为自增主键。

• 插入数据时,设置主键列的值为NULL 或 不设置主键列的值(推荐) ,主键列的值都会自动生成。

sql 复制代码
drop table student;

create table student (
 id bigint primary key auto_increment, 
 name varchar(20),
 age int
);

• 查看表结构,id列的 Extra 属性值 为auto_increment 表示自增 。


• 如果某条记录写入失败 ,新生成的主键值 将会作废。

由于 id 重复 ,产生了唯一冲突 ,导致插入失败 ,ID为 3 的主键值作废。

修改 id 后成功插入数据 ,查询后发现新记录 id 列的值为4。


• 主键值可以不 连续,手动指定⼀个值,下一次自增从主键 的最大值开始。

当然也可以手动指定中间的值 ,但是下一次自增仍从主键 的最大值开始。


• 主键或唯一键 有冲突时 的更新操作


• 替换 ,如果存在冲突 则替换,不存在冲突 则插入。


• 一个表 中只能有一个主键


一个主键可以包含多个列

• 复合主键,由多个列共同组成的主键 ,主键是否冲突 以多个列的组成进行判定。


6.FOREIGN KEY 外键约束


举例:

• 创建班级表(主表),并初始化数据

• 重构学生表(从表) ,加入外键约束

sql 复制代码
create table class (
 id bigint primary key auto_increment,
 name varchar(20) not null
);
sql 复制代码
# 创建外键约束
class_id bigint,
foreign key (class_id) references class(id) 

• 查看表结构,class_id列的Key 属性值 为 MUL ,表示该列已成功添加外键约束。



• 正常向从表 中插入 数据,班级编号在主表中存在,插入成功。


• 插入班级Id为NULL 的记录,可以成功 ,表示当前学生还没有分配班级。



• 删除主表 前,请先处理依赖关系 ,可选择删除从表 或 解除所有外键约束或 清空从表数据。

解除所有外键约束

清除从表数据


7.CHECK 约束



相关推荐
captain3762 小时前
MyBatis(入门5)其他查询操作
java·数据库·spring boot·mybatis
小此方3 小时前
Re:Mysql数据库基础篇(八):详细讲解复合查询、多表查询、自连接、多行、多列子查询与合并查询
数据库·mysql
xszivvvv3 小时前
Mariadb数据库frm文件异常,如何恢复数据
数据库·mariadb
smile_life_4 小时前
MySQL 设置 防止账户被暴力破解
数据库·mysql
ShineWinsu4 小时前
对于Qt:QRadioButton常见属性以及QButtonGroup的解析
数据库·c++·qt·microsoft·gui·qradiobutton·qbuttongroup
测试盐5 小时前
oracle数据库卡顿排查
数据库·oracle
滕州市燕猫虎计算机科技工作室个体工商户5 小时前
MySQL、MVCC、多版本并发控制
数据库·mysql·mvcc·数据库事务
明航咨询-陈老师5 小时前
ITSS运行维护服务能力成熟度认证技术纵深:标准模型、等级路径、2026审核趋势与CS/CMMI对比
服务器·数据库·cmmi
缓慢更新6 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
AI小百科6 小时前
向量数据库:AI 的「记忆仓库」是怎么工作的
数据库·人工智能·oracle