系列三、约束

news2024/11/26 20:44:46

一、概述

1.1、定义

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

1.2、作用

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

1.3、分类

注意事项:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。 

二、演示

需求:新建一个tb_user表,字段需满足如下要求

CREATE TABLE tb_user(
    id int AUTO_INCREMENT PRIMARY KEY COMMENT 'ID唯一标识',
    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 '性别'
);

测试用例

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

insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');
insert into tb_user(name,age,status,gender) values (null,19,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom4',80,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',-1,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',121,'1','男');
insert into tb_user(name,age,gender) values ('Tom5',120,'男');

 三、外键约束

3.1、作用

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

3.2、建表SQL

drop table if exists department;
create table department(
	id int auto_increment comment 'ID' primary key,
	name varchar(50) not null comment '部门名称'
)comment '部门表';

INSERT INTO department (id, name) VALUES 
(1, '研发部'), 
(2, '市场部'),
(3, '财务部'), 
(4,'销售部'), 
(5, '总经办');

drop table if exists employee;
create table employee(
	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',
	department_id int comment '部门ID'
)comment '员工表';

INSERT INTO employee (id, name, age, job,salary, entrydate, managerid, department_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);

3.3、添加外键

3.3.1、语法

CREATE TABLE 表名(
    字段名 数据类型,
    ...
    [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
);

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名)
REFERENCES 主表 (主表列名) ;

3.3.2、案例

需求:为 employee 表的department _id 字段添加外键约束 ,关联department表的主键id

alter table employee add constraint fk_employee_department_id foreign key (department_id) references department(id);

测试:删除部门id为1的部门

3.4、删除外键

3.4.1、语法

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;  

3.4.2、案例

需求:删除employee表的外键fk_employee_department_id

alter table employee drop foreign key fk_employee_department_id;

3.5、删除/更新行为

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

3.5.1、语法

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES
主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;

3.5.2、演示-CASCADE

步骤:

        1、添加cascade约束

alter table employee add constraint fk_employee_department_id foreign key 
(department_id) references department(id) on update cascade on delete cascade ;

        2、修改父表id1的记录,将id修改为6,观察结果

        注意事项:般情况下,不会修改主键的值

        3、删除department表id为6的记录

             delete from department where id = 6;

3.5.3、演示-SET NULL

在进行测试之前,我们先需要先执行如下脚本将数据进行恢复。

alter table employee drop foreign key fk_employee_department_id;

drop table if exists department;
create table department(
	id int auto_increment comment 'ID' primary key,
	name varchar(50) not null comment '部门名称'
)comment '部门表';

INSERT INTO department (id, name) VALUES 
(1, '研发部'), 
(2, '市场部'),
(3, '财务部'), 
(4,'销售部'), 
(5, '总经办');

drop table if exists employee;
create table employee(
	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',
	department_id int comment '部门ID'
)comment '员工表';

INSERT INTO employee (id, name, age, job,salary, entrydate, managerid, department_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);

alter table employee add constraint fk_employee_department_id foreign key (department_id) references
department(id) on update set null on delete set null ;

步骤:

        1、删除department表id为1的记录,观察employee表中的数据情况

        delete from department where id = 1;

        2、删除之前

        

        3、删除之后


 

 

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

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

相关文章

DEV C++的使用入门程序做算术运算

DEV C Dev-C &#xff08;有时候也称为 Dev-Cpp&#xff09;是一个免费软件&#xff0c;最早是由 BloodShed 公司开发的&#xff0c;在版本 4.9.2 之后该公司停止开发并开放源代码。然后由 Orwell 接手进行维护&#xff0c;陆续开发了几个版本&#xff0c;后来也有其他开发人员…

基于RK3399+Linux QT地面测试台多参数记录仪测试平台软件设计(二)

rk3399 是由本土芯片厂商瑞芯微&#xff08;Rockchip&#xff09;研发的高性能、低功耗“中国芯”。在 2016 年 4 月&#xff0c;rk3399 首次在香港举行的电子展上亮相。芯片使用六核大 LITTLE 处理器&#xff1a; 包括四核的 Cortex-A53 和双核的 Cortex-A72&#xff0c;主频可…

ubuntu22下phpstorm + xdebug调试php

文章目录前言环境主要步骤xedbug的安装xedbug.so的安装浏览器安装xdebug-helperphpstorm 配置xdebug前言 主要借鉴 https://blog.csdn.net/yinhangbbbbb/article/details/79247331 但是在linux下搭建还是遇到了不少问题 环境 phpstudy phpstorm xdebug 主要步骤 phpstudy、…

Nginx学习 (1) —— 初识Nginx(编译安装、启动停止、简单配置)

文章目录Nginx的发行版本Nginx的编译安装&#xff08;ubuntu18.04&#xff09;Nginx相关操作Nginx启动停止命令安装Nginx为系统服务Nginx的目录结构与基本原理目录结构&#xff1a;基本运行原理&#xff1a;基础配置&#xff1a;核心配置Nginx的发行版本 Nginx开源版&#xff…

【UE4 制作自己的载具】1-使用3dsmax制作载具

学习谌嘉诚课程所做笔记源视频链接&#xff1a;【虚幻4】UE4雪佛兰科迈罗汽车详细制作中文教程&#xff01;&#xff08;汽车骨骼绑定驾驶、动画蓝图&#xff09;汽车模型下载链接&#xff1a;https://pan.baidu.com/s/1ZH5gaAwckzRIZ0w6n0qvIA密码&#xff1a;19sj步骤&#x…

【2023蓝桥杯】2017年第八届C/C++A组真题(解析笔记)

目录 T1&#xff1a;迷宫 - 暴力dfs标注 T2&#xff1a;跳蚱蜢 - 9数算式 全排列 枚举乘号位置 T3&#xff1a;魔方状态 - 模拟 判重 &#xff08;高手入*****&#xff09; T4&#xff1a;方格分割 - dfs 从中心点去切割 T5&#xff1a;字母组串 - 递归思维-搞清楚参数…

Spring架构篇--2.5.4 远程通信基础--Select 源码篇--selector.close()总结

前言&#xff1a;通过selector 的poll 来完成所有socket 事件的监听&#xff0c;当不需要selector时 通过selector.close() 完成通道的关闭和资源的释放&#xff1b; 1 selector.close()关闭&#xff1a; AbstractSelector 类中close 方法&#xff1a; public final void cl…

简单说说OSI网络七层模型

如果你读过计算机专业&#xff0c;或者学习过网络通信&#xff0c;那你一定听说过 OSI 模型&#xff0c;它曾无数次让你头大。OSI 是 Open System Interconnection 的缩写&#xff0c;译为“开放式系统互联”。OSI 模型把网络通信的工作分为 7 层&#xff0c;从下到上分别是物理…

你知道这几种常见的JVM调优场景吗?

看此文前需已了解了运行时的数据区域和常用的垃圾回收算法&#xff0c;也了解了Hotspot支持的垃圾回收器。 一、cpu占用过高 cpu占用过高要分情况讨论&#xff0c;是不是业务上在搞活动&#xff0c;突然有大批的流量进来&#xff0c;而且活动结束后cpu占用率就下降了&#xf…

WebGL和OpenGL的区别及关系

什么是WebGLWebGL™是一个跨平台的&#xff0c;免版税的开放Web标准&#xff0c;用于基于OpenGL ES的低级3D图形API&#xff0c;通过HTML5 Canvas元素向ECMAScript公开。熟悉OpenGL ES 2.0的开发人员将使用GLSL将WebGL识别为基于Shader的API&#xff0c;其构造在语义上与底层Op…

FISCO BCOS(二十七)———java操作WeBase

一、搭建fiscobcos环境 1.1、安装jdk1.8 https://blog.csdn.net/weixin_46457946/article/details/1232435131.2、安装mysql https://blog.csdn.net/weixin_46457946/article/details/1232447361.3、安装python https://blog.csdn.net/weixin_46457946/article/details/123…

Lookup argument总览

1. 引言 详情参看Ingonyama团队Tomer 2023年论文《A Brief History of Lookup Arguments》。 Bootle等人2018年论文《Nearly linear-time zero-knowledge proofs for correct program execution》中首次提出了lookup协议&#xff0c;用于证明如下statement&#xff1a; 此处…

Python socket之TCP通信、下载文件

TCP简介TCP介绍TCP协议&#xff0c;传输控制协议&#xff08;英语&#xff1a;Transmission Control Protocol&#xff0c;缩写为 TCP&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由IETF的RFC 793定义。TCP通信需要经过创建连接、数据传送、…

手撕八大排序(上)

排序的概念及其引用&#xff1a; 排序的概念&#xff1a; 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有…

Linux上基于PID找到对应的进程名以及所在目录

Linux上基于PID找到对应的进程名以及所在目录前言找到进程的pid通过top命令查看通过 ps -ef |grep nignx进行查看通过端口号进行查看查看nginx进程目录前言 在一台新接触的服务器&#xff0c;却不熟悉搭建所在目录的时候&#xff0c;这时候就就可以通过ps查找进程&#xff0c;并…

巧用性格上的差异来组建团队

你好&#xff0c;我是得物 App 交易平台及中间件平台的 Team Leader Alan。 组建团队过程中&#xff0c;你有没有遇到过类似的场景&#xff1a;团队中某些人之间总是互相不对付、气场不合&#xff0c;不管是日常沟通中还是方案对齐&#xff0c;总是会出现面红耳赤的场面。 从…

Linux_线程概念

进程回顾 在学习线程之前&#xff0c;我们先回顾一下之前讲的进程概念 当我们创建一个进程&#xff0c;操作系统会将磁盘中的代码load到内存中&#xff0c;然后创建当前进程的task_struct&#xff08;后面可能会用”PCB“或者”进程控制块“代替&#xff09;&#xff0c;创建…

egg+vue实现登录功能【解决vue中登录的潜在问题】

前后端登录功能实现前言一、cookie和session二、代码呈现1.egg部门代码2.vue代码过程前言 记忆在时间面前总是不堪一击&#xff01; 本人的记录&#xff0c;下面内容仅供参考&#xff0c;如有什么什么&#xff0c;请自行解决。 一、cookie和session 不多赘述&#xff0c;详情…

大数据Hadoop教程-学习笔记03【Hadoop MapReduce与Hadoop YARN】

视频教程&#xff1a;哔哩哔哩网站&#xff1a;黑马大数据Hadoop入门视频教程教程资源: https://pan.baidu.com/s/1WYgyI3KgbzKzFD639lA-_g 提取码: 6666【P001-P017】大数据Hadoop教程-学习笔记01【大数据导论与Linux基础】【17p】【P018-P037】大数据Hadoop教程-学习笔记02【…

风险的定义以及CAPM 和 APT

文章目录风险定义&#xff1a;CAPMAPT&#xff08;Arbitrage Pricing Theory&#xff09;套利定价模型风险定义&#xff1a; 投资组合的收益率等于组合中各资产收益率的加权平均&#xff0c;但是投资组合的标准差并不等于组合中各资产标准差的加权平均&#xff0c;而是小于等于…