约束

news2024/9/19 15:12:21

概述

概念

约束是作用于表中字段上的规则,用于限制存储在表中的数据。

目的

保证数据库中数据的正确、有效性和完整性。

分类

在这里插入图片描述
【注意】约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

约束演示

根据需求,完成表结构的创建。需求如下:
在这里插入图片描述

建表

create table user(
    id int primary key auto_increment comment '主键',
    name varchar(10) not null unique comment '姓名',
    age int check ( age > 0 && age <= 120 ) comment '年龄',
    status char(1) default '1' comment '状态',
    gender char(1) comment '性别'
)comment '用户表';

测试

insert into user(name,age,status,gender) values ('Tom1',19,'1','男'),('Tom2',25,'0','男');
insert into user(name,age,status,gender) values ('Tom3',19,'1','男');

insert into user(name,age,status,gender) values (null,19,'1','男'); --报错 name不能为null
insert into user(name,age,status,gender) values ('Tom3',19,'1','男'); --报错 name不能重复

insert into user(name,age,status,gender) values ('Tom4',80,'1','男');
insert into user(name,age,status,gender) values ('Tom5',-1,'1','男'); --报错 age为无效值
insert into user(name,age,status,gender) values ('Tom5',121,'1','男'); --报错 age为无效值

insert into user(name,age,gender) values ('Tom5',120,'男'); --stadus为1

外键约束

介绍

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

在这里插入图片描述
左侧的emp表是员工表,里面存储员工的基本信息,包含员工的ID、姓名、年龄、职位、薪资、入职日期、上级主管ID、部门ID,在员工的信息中存储的是部门的ID dept_id,而这个部门的ID是关联的部门表dept的主键id,那emp表的dept_id就是外键,关联的是另一张表的主键。
【注意】目前上述两张表,只是在逻辑上存在这样一层关系;在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的

测试

准备数据

create table dept(
 id int auto_increment comment 'ID' primary key,
 name varchar(50) not null comment '部门名称'
)comment '部门表';
INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4,'销售部'), (5, '总经办');

create table emp(
 id int auto_increment comment 'ID' primary key,
 name varchar(50) not null comment '姓名',
 age int comment '年龄',
 job varchar(20) comment '职位',
 salary int comment '薪资',
 entrydate date comment '入职时间',
 managerid int comment '直属领导ID',
 dept_id int comment '部门ID'
)comment '员工表';
INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id)
VALUES
 (1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),
 (2, '张无忌', 20,'项目经理',12500, '2005-12-05', 1,1),
 (3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
 (4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),
 (5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),
 (6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1);

在这里插入图片描述

删除id为1的部门信息

在这里插入图片描述
结果,删除成功之后,部门表不存在id为1的部门,而在emp表中还有很多的员
工,关联的为id为1的部门,此时就出现了数据的不完整性。 而要想解决这个问题就得通过数据库的外键约束

语法总览

在这里插入图片描述

添加外键

create table 表名(
 字段名 数据类型,
 ...
 [constraint] [外键名称] foreign key (外键字段名) references 主表 (主表列名) 
);
alter table 表名 add constraint 外键名称 foreign key (外键字段名) 
references 主表 (主表列名) ;

[ 案例 ]

为emp表的dept_id字段添加外键约束,关联dept表的主键id。

alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

在这里插入图片描述
添加了外键约束之后,再到dept表(父表)删除id为1的记录, 此时将会报错,不能删除或更新父表记录,因为存在外键约束。
在这里插入图片描述

删除外键

alter table 表名 drop foreign key 外键名称;

[ 案例 ]

删除emp表的外键fk_emp_dept_id。

alter table emp drop foreign key fk_emp_dept_id;

在这里插入图片描述

删除/更新行为

分类

添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:
在这里插入图片描述

具体语法

alter table 表名 add constraint 外键名称 foreign key (外键字段) references 主表名(主表字段名)on update cascade on delete cascade;

演示

  1. CASCADE
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade ;

A. 修改父表id为1的记录,将id修改为6
在这里插入图片描述

原来在子表中dept_id值为1的记录,现在也变为6了,这就是cascade级联的效果。

在一般的业务系统中,不会修改一张表的主键值。

B. 删除父表id为6的记录
在这里插入图片描述

父表的数据删除成功了,但是子表中关联的记录也被级联删除了。

  1. SET NULL
    在进行测试之前,先需要删除上面建立的外键 fk_emp_dept_id。然后再通过数据脚本,将emp、dept表的数据恢复了。
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null ;

删除id为1的数据:
在这里插入图片描述
发现父表的记录是可以正常的删除的,父表的数据删除之后,再打开子表 emp,发现子表emp的dept_id字段,原来dept_id为1的数据,现在都被置为NULL了。
在这里插入图片描述
这就是SET NULL这种删除/更新行为的效果。

总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 之时间子系统(八):hrtime 的实现机制

一、hrtimer 概述 在Linux内核中已经存在了一个管理定时器的通用框架。不过它也有很多不足&#xff0c;最大的问题是其精度不是很高。哪怕底层的定时事件设备精度再高&#xff0c;定时器层的分辨率只能达到Tick级别&#xff0c;按照内核配置选项的不同&#xff0c;在100Hz到10…

【性能评估工具】—— SLAM性能评估工具evo的安装与常用指令的详细介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、evo的安装1. 直接指令安装2. 换下载源进行安装 二、evo的使用1. 常见的数据集格式介绍3. 数据格式转换4. evo工具常用命令介绍5. 指令命令的使用 三、常用指…

科技赋能,智慧粮仓视频综合管理方案助力粮食安全

一、背景需求 随着科技的快速发展&#xff0c;智慧化、智能化管理已成为各行各业的重要发展方向。粮食仓储作为国家粮食安全战略的重要组成部分&#xff0c;其管理的科学性和智能化水平直接关系到粮食的存储安全、品质保障和运营效率。 因此&#xff0c;TSINGSEE青犀提出一套…

Agilent 安捷伦 DSO90804A 高性能示波器

Agilent 安捷伦 DSO90804A 高性能示波器 DSO90804A Infiniium 高性能示波器&#xff1a;8 GHz 8 GHz4个模拟通道高达 1 Gpts 存储器和 40 GSa/s 采样率可以提供更完整的信号迹线捕获50 mV/格时低至 1.15 mVrms 的本底噪声和深入的抖动分析功能可以确保卓越的测量精度硬件加速…

B3636 源代码

快速直达专线 原文 题解没给代码&#xff0c;所以这里给一下 #include<bits/stdc.h> using namespace std; int f[10000007]; int main(){int n;cin>>n;//int cab;f[1]0;for(int i2;i<n5;i){if(i%20)f[i]min(f[i-1]1,f[i/2]1);//是偶数都有可能else f[i]f[i-1…

如何使用简鹿水印助手或 Photoshop 给照片添加文字

在社交媒体中&#xff0c;为照片添加个性化的文字已经成为了一种流行趋势。无论是添加注释、引用名言还是表达情感&#xff0c;文字都能够为图片增添额外的意义和风格。本篇文章将使用“简鹿水印助手”和“Adobe Photoshop”这两种工具给照片添加文字的详细步骤。 使用简鹿水印…

c++信号和槽机制的轻量级实现,sigslot 库介绍及使用

Qt中的信号与槽机制很好用&#xff0c;然而只在Qt环境中。在现代 C 编程中&#xff0c;对象间的通信是一个核心问题。为了解决这个问题&#xff0c;许多库提供了信号和槽&#xff08;Signals and Slots&#xff09;机制。今天推荐分享一个轻量级的实现&#xff1a;sigslot 库。…

bootstrap-datetimepicker设置时分

bootstrap-datetimepicker设置时分 需求背景时分年月日 需求背景 在日常工作中遇到一个业务场景&#xff0c;需要时间控件来选择时分&#xff0c;但是不需要年月日的成分&#xff0c;实现之后的效果如图 那么下面就开始查找相关的时间控件插件&#xff0c;这里示例图中用到的…

9.11和9.9哪个大?

没问题 文心一言 通义千问

make2s2o:自动编译汇编

模板Makefile&#xff0c;编译多个C/C模块成平台相关的汇编码与目标码。

Linux先行一步

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

十、操作符详解

目录 1、操作符分类 2、二进制转换 2.1二进制转十进制 2.1.1、十进制转二进制 2.2、二进制转八进制和十六进制 2.2.1、二进制转八进制 2.2.2、二进制转十六进制 3、原码、反码、补码 4、移位操作符&#xff08;移动的是二进制位&#xff09; 4.1、左移操作符 4.2、右…

vue3中provide 和 inject 用法#Vue3中解决局部刷新问题

vue3中provide 和 inject 用法#Vue3中解决局部刷新问题 在父子组件传递数据时&#xff0c;通常使用的是 props 和 emit&#xff0c;父传子时&#xff0c;使用的是 props&#xff0c;如果是父组件传孙组件时&#xff0c;就需要先传给子组件&#xff0c;子组件再传给孙组件&…

前端如何支持i18n?

何为i18n&#xff1f; 系统支持多语言的功能称之为国际化&#xff0c;英文为 internationalization 一共18个字母&#xff0c;简称i18n。随机近些年国内市场饱和&#xff0c;各厂商纷纷出海&#xff0c;i18n成了必要的能力。 如何做&#xff1f; 简单介绍下思路&#xff0c;就…

C语言两数相除(要求只能使用加法和减法)求商和余数

思路分析&#xff1a;举个例子如 8/3 2余2 8-35 5-32 减了2次 最后一次结果为2 9/33 9-36 6-33 3-30 减了3次 最后一次为0 10/33余1 10-37 7-34 4-31 减了3次 最后一次为1 所以可以得出规律为…

huawei USG6001v1学习---防火墙相关知识(2)

目录 1.安全策略 2.防火墙的状态检测和会话表技术 3.FTP 4.用户认证 5.认证策略 1.安全策略 传统包过滤技术 --- 其本质就是ACL访问控制列表&#xff0c;根据数据包的特征进行过滤&#xff0c;对比规则&#xff0c; 执行对应的动作&#xff1b; 这里数据包的特征 --- …

Nest.js 实战 (二):如何使用 Prisma 和连接 PostgreSQL 数据库

什么是 Prisma? Prisma 是一个开源的下一代 ORM。它包含了以下部分&#xff1a; Prisma Client: 自动生成、类型安全的查询构建器&#xff0c;用于 Node.js 和 TypeScriptPrisma Migrate: 数据迁移系统Prisma Studio: 查询和编辑数据库中数据的图形化界面 Prisma 客户端可以…

Java面试(持续更新)

Redis使用场景 缓存穿透 当有该数据的时候&#xff0c;redis中的数据已经是原来数据的null值了&#xff0c;可能会出现不一致的问题。 缓存击穿 跟钱相关的强一致用互斥锁。 用户高体验用逻辑过期。 缓存雪崩 ttl随机值 mysql于redis保持数据同步 Redis持久化问题 RDB AOF R…

复习知识点java

目录 1.题目分析&#xff1a;2.思考题3.题目&#xff1a;4.题目&#xff1a;求X的反码和补码计算反码计算补码 计算2乘以8的结果实现两个整数变量的交换异或运算符&#xff08;^&#xff09;的特点 1.题目 byte b13,b24,b; bb1b2; b34; 哪句是编译失败的呢&#xff1f;为什么呢…

【人工智能】机器学习 -- 决策树(乳腺肿瘤数)

目录 一、使用Python开发工具&#xff0c;运行对iris数据进行分类的例子程序dtree.py&#xff0c;熟悉sklearn机器实习开源库。 二、登录https://archive-beta.ics.uci.edu/ 三、使用sklearn机器学习开源库&#xff0c;使用决策树对breast-cancer-wisconsin.data进行分类。 …