首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数据库造神计划第十二天---数据库约束(3)

数据库造神计划第十二天---数据库约束(3)

作者头像
寻星探路
发布2025-12-17 19:11:54
发布2025-12-17 19:11:54
1200
举报
文章被收录于专栏:CSDN博客CSDN博客

一、约束类型(续)

1、foreign key外键约束

外键用于定义主表和从表之间的关系 外键约束主定义在从表的列上,主表关联的列必须是主键或唯⼀约束 当定义外键后,要求从表中的外键列数据必须在主表的主键或唯⼀列存在或为null。

1.1创建班级表(主表),并初始化数据
代码语言:javascript
复制
drop table if exists class;
# 建表
create table class (
    id bigint primary key auto_increment,
    name varchar(20) not null
);

# 初始化数据
insert into class (name) values ('java'), ('C'), ('C++'), ('python'), ('go');

select * from class;

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

语法:

代码语言:javascript
复制
foreign key (id) references class(id)
代码语言:javascript
复制
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) # 创建外键约束
);
1.3查看表结构

Key列的值为MUL表示外键约束的列

代码语言:javascript
复制
desc student;
1.4插入数据

正常插入数据

代码语言:javascript
复制
# 班级编号在主表中存在
insert into student(name, class_id) values ('张三', 1), ('李四', 2);

# 插⼊成功
select * from student;

插入⼀个班级号为100的学生,由于主表中没有这个班级,插入失败

代码语言:javascript
复制
# 班级编号在主表中不存在,提⽰外键约束限制导致插⼊失败
insert into student(name, class_id) values ('王五', 100);

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

代码语言:javascript
复制
# 班级为NULL
insert into student(name, class_id) values ('王五', NULL);

select * from student;

1.5删除记录

删除主表某条记录时,从表中不能有对该记录的引用

代码语言:javascript
复制
# 删除从表中没有引⽤的记录,可以成功
delete from class where name = 'go';

select * from class;

代码语言:javascript
复制
# 删除从表中引⽤的记录,失败
delete from class where name = 'java';
1.6删表

删除主表时要先删除从表

代码语言:javascript
复制
# 从表存在是不能删除主表
drop table class;
代码语言:javascript
复制
# 删除从表
drop table student;

# 再删除主表,成功
drop table class;

#注:

(1)外键约束虽然让我们感觉起来很麻烦,但却是不可缺失的!!!

(2)使用外键约束可以增添校验能力,有效减少错误的发生

2、check约束

可以应用于⼀个或多个列,用于限制列中可接受的数据值,从而确保数据的完整性和准确性。 在8.0.16开始全面支持check约束,之前的版本会忽略check的定义

2.1重构学生表

有以下要求,年龄不能小于16岁,性别只能是男或女(在某些国家,性别的数量高达几十种!!!)

代码语言:javascript
复制
drop table if exists student;

# 加⼊CHECK约束
create table student(
    id bigint PRIMARY KEY auto_increment,  # 设置⾃增主键
    name varchar(20) not null,
    age int DEFAULT 18,
    gender char(1),
    check (age >= 16),
    check (gender = '男' or gender = '⼥')
);

# 正常插⼊数据
insert into student(name, age, gender) values ('张三', 17, '男'), ('李四',19,'女');

select * from student;
代码语言:javascript
复制
# 插⼊年龄⼩于16岁的记录,失败
insert into student(name, age, gender) values ('张三', 15, '男');
代码语言:javascript
复制
# 插⼊性别的值不是男或⼥的记录,失败
insert into student(name, age, gender) values ('张三', 17, '1');
2.2创建新表

c1的值不能为0,c2的值必须大于0,c3的值不小于c2

代码语言:javascript
复制
# 列与列之间也可以⽐较,需要在单独⼀⾏中定义
create table t_check (
    c1 int check(c1 <> 0),
    c2 int check(c2 > 0),
    c3 int,
    check(c3 >= c2)
);

# 插⼊正常数据
insert into t_check values (-1, 3, 10);

select * from t_check;
代码语言:javascript
复制
 # c1 = 0时,失败
 insert into t_check values (0, 5, 6);
代码语言:javascript
复制
# c2 <= 0时,失败
insert into t_check values (2, -10, 10);
代码语言:javascript
复制
# c3 < c2时,失败
insert into t_check values (2, 10, 9);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、约束类型(续)
    • 1、foreign key外键约束
      • 1.1创建班级表(主表),并初始化数据
      • 1.2重构学生表(从表),加入外键约束
      • 1.3查看表结构
      • 1.4插入数据
      • 1.5删除记录
      • 1.6删表
    • 2、check约束
      • 2.1重构学生表
      • 2.2创建新表
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档