SQL常见约束及外键约束删除更新行为

一.约束

1.概念

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

2.目的:

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

3.添加约束两种方式

可以在创建表/修改表的时候添加约束。

在为字段添加约束时,我们只需要在字段之后加上约束的关键字即可

二.约束分类

SQL中的约束用于确保数据库中数据的完整性、唯一性和一致性。常见的SQL约束分类包括:

1.非空约束(NOT NULL)

指定该字段不能为空。

- 例如,在创建学生表时,将学生ID和姓名字段设置为非空,以确保每个学生都有一个唯一的标识符和一个名字。

CREATE TABLE Students (
    StudentID int NOT NULL,
    Name varchar(255) NOT NULL
);
 2. 默认约束(DEFAULT)

指定一个默认值来设置默认约束。
 例如,在创建员工表时,将入职日期字段设置为默认值为'2023-01-01',如果没有提供入职日期,则默认使用这个日期。

CREATE TABLE Employees (
    EmployeeID int NOT NULL AUTO_INCREMENT,
    JoinDate date DEFAULT '2023-01-01'
);
3. 唯一约束(UNIQUE)


指定该字段的值必须是唯一的,不允许重复。
 例如,在创建用户表时,将电子邮件地址字段设置为唯一,以确保每个用户的电子邮件地址都是唯一的。

CREATE TABLE Users (
    UserID int NOT NULL AUTO_INCREMENT,
    Email varchar(255) UNIQUE
);
4. 主键约束(PRIMARY KEY)

指定表中的某个字段或字段组合必须是唯一的
   例如,在创建订单表时,将订单ID字段设置为主键,以确保每个订单都有一个唯一的标识符。

CREATE TABLE Orders (
    OrderID int NOT NULL AUTO_INCREMENT,
    CustomerID int,
    PRIMARY KEY (OrderID)
);

注意:

当指定一个字段为主键时,该字段必须是非空且唯一的 主键的主要特点如下: 唯一性:主键的值必须是唯一的,这意味着在任何时候,表中都不能有两行具有相同的主键值。这保证了每一行数据都能被唯一地区分和识别。 非空:主键字段不允许接受空值(NULL)。这是为了确保每一行都可以通过主键字段进行标识和访问。

5. 外键约束(FOREIGN KEY)

用于建立两个表之间的链接,指向另一个表的主键。
添加`FOREIGN KEY`关键字并指定引用的主键字段来设置外键约束。
 外键用于建立两个表之间的链接,确保数据的一致性和完整性。
 例如,在创建订单详情表时,将订单ID字段设置为外键,并引用订单表中的订单ID字段,以确保订单详情与相应的订单相关联

CREATE TABLE OrderDetails (
    OrderDetailID int NOT NULL,
    OrderID int,
    ProductID int,
    PRIMARY KEY (OrderDetailID),
    FOREIGN KEY (OrderID) REFERENCES Orders(OrderID)
);
6. 检查约束(CHECK)

  检查约束用于限制字段的值必须满足特定的条件。

(注意:MySQL不支持CHECK约束的直接语法,但可以通过触发器实现):

 在其他支持CHECK约束的数据库中,可以这样创建:

在创建表时,通过在字段后面添加`CHECK`关键字并指定一个逻辑表达式来设置检查约束。
  
 例如,在创建产品表时,将价格字段设置为检查约束,确保价格大于0。 

CREATE TABLE Products (
    ProductID int NOT NULL,
    Price decimal(10, 2) CHECK (Price > 0)
);

三.外键约束

1.什么是外键约束?

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

2.两种创建方式
1.创建表时创建外键约束

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

2.对存在的表创建外键

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

注意 主表要有主键,才能顺利添加从表外键 而外键关联的时候从表字段一定是关联和主表的主键,但是从表有没有主键则无关紧要

3.删除外键

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

4. 删除/更新行为

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

1. RESTRICT /NO ACTION(限制)

如果在父表上有关联的子表记录存在,那么父表上的记录不能被删除或更新。这是默认的约束行为。

ALTER TABLE 子表 ADD CONSTRAINT fk_外键列 FOREIGN KEY (外键列) REFERENCES 父表(主键列) ON DELETE RESTRICT ON UPDATE RESTRICT; 
ALTER TABLE 子表 ADD CONSTRAINT fk_外键列 FOREIGN KEY (外键列) REFERENCES 父表(主键列) ON DELETE NO ACTION ON UPDATE NO ACTION; 
2. CASCADE(级联)

当父表上的记录被删除或更新时,关联的子表记录也会被对应删除或更新。

ALTER TABLE 子表 ADD CONSTRAINT fk_外键列 FOREIGN KEY (外键列) REFERENCES 父表(主键列) ON DELETE CASCADE ON UPDATE CASCADE
3. SET NULL(设置为NULL)

当父表上的记录被删除或更新时,子表中的外键列会被设置为NULL。

ALTER TABLE 子表 ADD CONSTRAINT fk_外键列 FOREIGN KEY (外键列) REFERENCES 父表(主键列) ON DELETE SET NULL ON UPDATE SET NULL;
4. SET DEFAULT(设置为默认值)

当父表上的记录被删除或更新时,子表中的外键列会被设置为默认值。

ALTER TABLE 子表 ADD CONSTRAINT fk_外键列 FOREIGN KEY (外键列) REFERENCES 父表(主键列) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

状态模式

文章目录 1.UML类图2.状态基类3.状态实现类3.状态机管理类使用示例 1.UML类图 2.状态基类 public abstract class State {public string? Name { get; set; }public StateMachine? StateMachine {get; set;}public abstract void Exit();public abstract void Enter(); }3.…

Devops部署maven项目

这里讲下应用k8s集群devops持续集成部署maven项目的流程。 failed to verify certificate: x509: certificate signed by unknown authority 今天在执行kubectl get nodes的时候报的证书验证问题,看了一圈首次搭建k8s的都是高频出现的问题。 couldn’t get curren…

输入N,从1~N中挑出若干对数字,比如(a,b),(c,d)

题目: 输入N,从1~N中挑出若干对数字,比如(a,b),(c,d) 规定这个数对的value为两数之和,比如(a,b)的value为ab 现在从1~N中挑出若干个数对,他们满足: 每个数字只能被挑出一次 每个数对的value都不相等 每个数对的value都小于等于N 求:对于给定的N,能挑出这样的数对的最大个数max …

2024年Q1葡萄酒行业线上电商(京东天猫淘宝)销售排行榜

五一聚餐不可缺少饮品——葡萄酒。鲸参谋监测的线上电商平台(某东)Q1季度葡萄酒行业销售数据已揭晓! 从鲸参谋的数据中,我们可以明显看到今年Q1季度在线上电商平台(某东)葡萄酒行业的销售情况呈现出积极的…

【C++】STL使用详解

文章目录 前言1. string类1.1 string类对象的常见构造1.2 string类对象的容量操作1.3 string类对象的访问及遍历操作1.4 string类对象的修改操作1.5 string类非成员函数 2. vector2.1 vector的介绍2.2 vector的使用2.3 vector的迭代器2.4 vector空间容量操作2.5 vector增删查改…

笨蛋学C++之 C++连接数据库

笨蛋学C 之 VS2019使用C连接数据库 创建数据库SQL语句VS2019选择空项目,点击下一步创建输入项目名称,点击创建创建成功点击新建项创建源文件因为mysql是64位,此时的c项目是86位,所以这里需要将项目修改为x64位点击项目 -> 0501…

基于Python的人脸识别系统设计与实现(论文+源码)_kaic

基于Python的人脸识别系统设计与实现 摘 要 随着人工智能的发展,人脸识别系统在我们的生活中越来越被广泛应用。人脸识别系统是指能够从数字图像或视频源中识别人的技术。人脸识别系统可以通过多种方法工作,但是,它们通常是通过将给定图像中的面部特征与…

基于Vue Router和element-ui的LayOut

一、展示 二、代码 app.vue <template><div id"app"><el-container style"border: 1px solid #eee; height: 100vh"><el-aside v-bind:width"asideWidth" style"background-color: rgb(48, 65, 86);"><…

基于ROS从零开始构建自主移动机器人:仿真和硬件

书籍&#xff1a;Build Autonomous Mobile Robot from Scratch using ROS&#xff1a;Simulation and Hardware 作者&#xff1a;Rajesh Subramanian 出版&#xff1a;Apress 书籍下载-《基于ROS从零开始构建自主移动机器人&#xff1a;仿真和硬件》您将开始理解自主机器人发…

ip地址与硬件地址的区别是什么

在数字世界的浩瀚海洋中&#xff0c;每一台联网的设备都需要一个独特的标识来确保信息的准确传输。这些标识&#xff0c;我们通常称之为IP地址和硬件地址。虽然它们都是用来识别网络设备的&#xff0c;但各自扮演的角色和所处的层次却大相径庭。虎观代理小二将带您深入了解IP地…

karpathy make more -- 4

1 Introduction 这个部分要完成一个网络的模块化&#xff0c;然后实现一个新的网络结构。 2 使用torch的模块化功能 2.1 模块化 将输入的字符长度变成8&#xff0c;并将之前的代码模块化 # Near copy paste of the layers we have developed in Part 3# -----------------…

爬虫学习:基本网络请求库的使用

目录 一、urllib网络库 1.urlopen()方法 2.request方法 二、requests网络请求库 1.主要方法 2.requests.get()和requests.post() 一、urllib网络库 1.urlopen()方法 语法格式&#xff1a; urlopen(url,data,timeout,cafile,capath,context) # url:地址 # data:要提交的数据…

[华为OD]C卷 机场航班调度 ,XX市机场停放了多架飞机,每架飞机都有自己的航班号100

题目&#xff1a; XX市机场停放了多架飞机&#xff0c;每架飞机都有自己的航班号CA3385, CZ6678, SC6508 等&#xff0c;航班号的前2个大写字母&#xff08;或数字&#xff09;代表航空公司的缩写&#xff0c;后面4个数字代表航班信息。 但是XX市机场只有一条起飞用跑道&am…

uniapp源码+计划任务 台股平台源码 新股申购 分类后台控制

台股平台源码集成了新股申购与折扣申购功能&#xff0c;结合了计划任务和UniApp源码&#xff0c;为用户提供了一个全面的股票交易解决方案。 经过初步测试&#xff0c;系统可正常运行。测试时没有配置计划任务和WebSocket 。有兴趣的自行研究。 本系统基于PHP 7.3版本开发&am…

【记录】Springboot项目集成docker实现一键部署

公司管理平台完成后&#xff0c;为了方便其他不懂开发的同事部署和测试&#xff0c;集成docker进行一键部署&#xff0c;也为后面自动化部署做准备。本文做个简单记录。 1、安装docker yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/cont…

maven插件:dockerfile-maven-plugin和docker-maven-plugin

Maven插件dockerfile-maven-plugin和docker-maven-plugin都是为Java开发人员提供了一种便捷的方式&#xff0c;通过Maven构建流程来自动化创建、管理和推送Docker镜像。虽然它们有着相似的目标&#xff0c;即集成Docker与Maven项目&#xff0c;但这两个插件在实现细节、功能侧重…

嵌入式全栈开发学习笔记---C语言笔试复习大全3

目录 笔试题3 笔试题4 笔试题5 上一篇介绍了数据类型的长度和数据范围&#xff0c;并且分别讲解了两个经典的笔试题&#xff0c;这一篇我们再来看三道非常经典的考数据类型长度、数据范围和数据类型转换的笔试题。 说明&#xff1a;我们学过单片机的一般都是有C语言基础的了…

Flask路由的使用

Flask 是一个轻量级的 Python Web 框架&#xff0c;其简洁的设计使得构建 Web 应用变得轻而易举。其中&#xff0c;路由是 Flask 中至关重要的一部分&#xff0c;它定义了 URL 与视图函数之间的映射关系&#xff0c;决定了用户请求的处理方式。在本文中&#xff0c;我们将深入探…

vue3项目引入VueQuill富文本编辑器(成功)及 quill-image-uploader 图像模块(未成功)

tip&#xff1a;重点解释都写在代码注释里了&#xff0c;方便理解&#xff0c;所以看起来比较密集 富文本基本使用 项目文件夹路径安装依赖 npm install vueup/vue-quilllatest --save 全局注册&#xff1a;main.js // main.js// 自己项目的一些配置&#xff08;只放了主要…

【C语言】文件操作(万字解读超详细解析)

最好的时光&#xff0c;在路上;最好的生活&#xff0c;在别处。独自上路去看看这个世界&#xff0c;你终将与最好的自己相遇。&#x1f493;&#x1f493;&#x1f493; 目录 • ✨说在前面 &#x1f34b;知识点一&#xff1a;什么是文件&#xff1f; • &#x1f330;1.程序…
最新文章