如何管理约束

        本文主要介绍如何管理约束,包括决定何时发生约束检查,如何删除约束,删除和更新父行,插入和更新子行。

1. 约束事务模式

  约束事务模式决定何时发生引用违例检查。

  • 对于具有日志记录的数据库
    — 即时约束(Immediate constraint)检查会在执行完每个语句之后检查违例
    — 延迟约束(Deferred constraint)检查会在COMMIT时检查违例

  • 对于没有日志记录的数据库
    — 分离约束(Detached constraint)检查会在执行语句时检查表中处理的每行的违例,是唯一可用于没有日志记录的数据库的模式,但不适用于具有日志记录的数据库

  可以使用SET CONSTRAINTS语句更改事务模式。例如:

SET CONSTRAINTS pk_orders,fk_orders DEFERRED;

  您可以通过DEFERRED或IMMEDIATE子句标识SET CONSTRAINTS命令的事务模式格式。 SET CONSTRAINT语句的事务模式格式的持续时间是其执行的事务。您不能执行SET CONSTRAINTS语句来设置事务之外的事务模式。一旦执行COMMIT WORK或ROLLBACK WORK语句,事务模式将恢复为IMMEDIATE。

  SET CONSTRAINTS命令也用于更改约束的对象模式。SET CONSTRAINTS命令的对象模式格式由ENABLED,DISABLED或FILTERING子句标识。

2. 即时约束(Immediate constraint)检查

CREATE TABLE test (current_no INTEGER UNIQUE);
UPDATE test SET current_no = current_no + 1;

F749`D80YFYN{4_C6R

F749`D80YFYN{4_C6R867×339 8.54 KB

  即时(或有效)检查指定约束检查在每个语句的末尾发生。如果一些约束不满足,则似乎没有执行该语句。即时检查是默认模式。

  在上述示例中,在更新第一行之后但在更新第二行之前,存在违反唯一索引约束的重复值。但是,在更新所有行之后,所有值都是唯一的,因此成功执行语句。

2.1 如何实施即时约束检查

  违反约束的更改可以成功,但会记录为违例。稍后,在语句的末尾会进行检查以查看违例是否仍然存在。如果仍然存在,则会返回错误并撤销该语句。保留点用于允许数据库服务器撤销单个语句的影响,而不会撤销同一事务中早期的更改。通过在语句开头建立保留点,如果在有效检查期间发生约束冲突,数据库服务器就可以回滚到该保留点。

  对于引用约束,内存缓冲区或临时表会记录违例。一个临时表记录每个引用对的违例。临时表保存违例的键值。当插入,删除和更新行时,将会更新临时表以反映新的违例并删除旧的违例。稍后,当检查完成后,将会扫描临时文件,对于那些仍然有效的键,将重新验证违例。当违例已消除时,将从临时表中删除记录。为了检查约束,将再次使用内存缓冲区或临时表。但是,这次临时表只记录违反行的rowid。当更新行时,将从临时表中删除通过检查约束的行。检查完成后,临时表应为空。

  对于唯一索引,检查是逐行执行的,而不是在语句的末尾执行。如果要执行有效检查,请使用唯一约束,而不是创建唯一索引。

3. 延迟约束(Deferred constraint)检查

ALTER TABLE orders ADD CONSTRAINT PRIMARY KEY (order_num);

ALTER TABLE items ADD CONSTRAINT FOREIGN KEY (order_num) REFERENCES orders;

如果设置了延迟约束检查,那么将提交此事物;如果未设置,那么将失败。

BEGIN WORK;
SET CONSTRAINTS ALL DEFERRED;
UPDATE orders SET order_num = 1006
 WHERE order_num = 1001;
UPDATE items SET order_num = 1006
 WHERE order_num = 1001;
COMMIT WORK;

  在上述的示例中,假定order_num列的数据类型是一个整数,而不是一个serial列。serial列是不能被更新的。当父表和子表中的主键值和外键值更改为新值时,将使用延迟检查。例如,如果要在orders和items表中更改订单编号,那么您可以使用延期检查。

  当需要切换表中两行或更多行的主键值时,也会使用延迟检查。

3.1 如何实施延迟约束检查

  延迟检查指定在事务提交或用户将模式更改为即时检查之前,不会发生约束检查。如果在提交时发生约束错误,则回滚事务。

  在上述示例中,如果约束模式未设置为延迟,那么该语句将失败。这是因为引用约束强制所有项都必须有一个订单的规则。在第一个更新语句中会发生故障,因为存在没有订单的items(orders 表中不再存在订单号1001)。

  延迟检查与即时检查类似。但是,对违例的检查是在事务结束时进行的,而不是在语句结束时。您必须在事务中设置SET CONSTRAINTS ALL DEFERRED语句。从设置到事务结束期间是有效的。您也可以使用约束名称替换关键字ALL,以便只延迟特定的约束。例如:

SET CONSTRAINTS uniq_ord DEFERRED;

  延迟检查不使用唯一索引(也就是使用UNIQUE关键字创建的索引)。 如果要在提交时完成检查,请使用唯一约束,而不是创建唯一索引。

4. 分离约束(Detached Constraint)检查

CREATE TABLE test (current_no INTEGER UNIQUE);
UPDATE test SET current_no = current_no + 1;

J$_VA`%IGH%8SP2~T9E

  拆离检查是唯一可用于no logging数据库和使用 WITH NO LOG 创建的临时表中的模式。如果日志记录未开启,则无法执行有效检查所需的回滚。

4.1 如何实施分离约束检查

  分离约束检查是逐行完成的。一旦发生约束错误,将立即向用户返回错误,并且不会执行其余的语句。

5. 性能影响

  • 通过对主键和外键使用索引来实现引用约束。
  • 在进行UPDATE,INSERT和DELETE操作时也更新索引。
  • 在每个UPDATE,INSERT和DELETE操作上查找索引。
  • 需要许多锁。所有使用的索引都具有共享锁。

  通过对适当的列内部创建唯一索引来强制执行唯一约束。
  当创建引用约束时,在外键列上构建非唯一索引。如果索引已经存在,则使用该索引。
  列可以同时具有引用和唯一约束。也可以有两个不同的引用约束。在这些情况下,使用单个索引来强制执行多个约束。

6. 删除约束

ALTER TABLE orders DROP CONSTRAINT pk_orders;

  ALTER TABLE可以删除主键约束和任何相应的外键约束。当删除外键约束时,相应的主键约束不受影响。

CREATE TABLE orders (
order_num SERIAL,
order_date DATE,
PRIMARY KEY (order_num) CONSTRAINT pk_orders);

CREATE TABLE items (
item_num SMALLINT,
order_num INTEGER,
FOREIGN KEY (order_num) REFERENCES orders
CONSTRAINT fk_orders);

ALTER TABLE orders DROP order_num;

  当删除具有约束的列时,不仅仅会影响ALTER TABLE语句中提到的表。引用已删除列的任何约束也将被删除。

  在上述示例中,删除表 orders 中的主键列需要在删除约束时锁定表 items 。此外,用于实现约束的索引只有在为该约束构建时才被删除。

7. 删除和更新父行

DELETE FROM orders WHERE order_num = (1004);

GU6(P(RSR%6ALOPEU4

  当在父表中删除或更新行时,索引用于支持引用完整性。

  在删除或更新父(主)表中的行之前,数据库服务器将查找与要更新或删除的行的主键对应的任何外键。当找到相应的外键时,在索引中的外键上放置一个共享锁。需要锁来测试要删除的键或尚未提交的新插入的外键的存在。

8.插入和更新子行

INSERT INTO items (order_num) VALUES (1004);

HGM$8M3BAMUK@Y1$4_PX

  将行插入或更新到子(从)表中时使用索引来支持引用完整性。

  在插入或更新行之前,数据库服务器将通过更新来查看此表上设置为非NULL值的所有外键。对于这些外键,数据库服务器使用与主键对应的唯一索引,并对父表执行查找。如果找到行,那么数据库服务器将会在索引键上放置共享锁来确保在插入或更新子行之前不删除该行。在插入或更新引用行之前,将一直保持锁定。

更多信息内容请移步星瑞格官方社区,期待大家加入  
Sinoregal Tech ForumAsk questions, share solutions, and get to know the Sinoregal community.icon-default.png?t=N7T8https://forum.sinoregal.cn/

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

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

相关文章

【笔试强训】Day4 --- Fibonacci数列 + 单词搜索 + 杨辉三角

文章目录 1. Fibonacci数列2. 单词搜索3. 杨辉三角 1. Fibonacci数列 【链接】:Fibonacci数列 解题思路:简单模拟题,要最少的步数就是找离N最近的Fibonacci数,即可能情况只有比他小的最大的那个Fibonacci数以及比他大的最小的那…

【VUE】Vue中实现树状表格结构编辑与版本对比的详细技术实现

Vue中实现树状表格结构编辑与版本对比的详细技术实现 在Vue中,创建一个可编辑的树状表格并实施版本对比功能是一种需求较为常见的场景。在本教程中,我们将使用Vue结合Element UI的el-table组件,来构建一个树状表格,其中包含添加、…

ICCV 2021 | FcaNet: Frequency Channel Attention Networks 中的频率分析

ICCV 2021 | FcaNet: Frequency Channel Attention Networks 中的频率分析 论文:https://arxiv.org/abs/2012.11879代码:https://github.com/cfzd/FcaNet 文章是围绕 2D 的 DCT 进行展开的,本文针对具体的计算逻辑进行梳理和解析。 f ( u ,…

【MySQL精炼宝库】数据库的约束 | 表的设计 | 聚合查询 | 联合查询

目录 一、数据库约束 1.1 约束类型: 1.2 案例演示: 二、表的设计 2.1 一对一: 2.2 一对多: 2.3 多对多: 2.4 内容小结: 三、新增 四、查询 4.1 聚合查询: 4.1.1 聚合函数: 4.1.2 GROUP BY子句&#xff1a…

linux使用docker 安装mysql redis

linux安装docker https://hub-stage.docker.com/ 前往这里搜索容器来部署。每个容器都有独立的运行环境。 具体安装教程 https://docs.docker.com/engine/install/centos/#install-using-the-repository 检查是否安装成功: sudo docker --version 配置国内镜像加速…

人脸识别概念解析

目录 1. 概述 2. 人脸检测 3. 人脸跟踪 4. 质量评价 5. 活体检测 6. 特征提取 7. 人脸验证 8. 人脸辨识 1. 概述 人脸识别在我们的生活中随处可见,例如在大楼门禁系统中,它取代了传统的门禁卡或密码,提高了进出的便捷性和安全性。在商…

Adfind的使用

Adfind是一个使用C语言写的活动目录查询工具,它允许用户轻松地搜索各种活动目录信息。它不需要安装,因为它是基于命令行的。它提供了许多选项,可以细化搜索并返回相关细节。下面讲解Adfind的参数以及其使用。 参数 执行如下命令即可查看Adf…

ruoyi-nbcio-plus基于vue3的flowable为了适配文件上传改造VForm3的代码记录

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…

Flutter笔记:DefaultTextStyle和DefaultTextHeightBehavior解读

Flutter笔记 DefaultTextStyle和DefaultTextHeightBehavior解读 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:htt…

PriorityQueue—优先级队列FollowUp

FollowUp大纲: 思维导图: FollowUp PriorityQueue: Q1:但不知道是大根堆化石小根堆 A:Q1 只需要放进去几个元素peek()出元素是大的还是小的 下面如果是5就是小根堆10就是大根堆 A:默认是小根…

Github创建远程仓库(项目)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

OPPO Reno10Pro/Reno11/K10手机强解BL刷root权限KSU内核抓包刷机救砖

OPPO Reno10Pro/Reno11/K10手机虽然发布时间并不久,但由于天玑处理器的体质,已经支持强制解锁BL了,该漏洞来自第三方工具适配,支持OPPO天机8100/8200刷机救砖解锁BL不需要等待官方深度测试直接实现。解锁BL后的OPPO Reno10Pro/Ren…

华为ensp中BGP(边界网关协议)基础原理及配置命令

作者主页:点击! ENSP专栏:点击! 创作时间:2024年4月27日10点04分 BGP(边界网关协议)是一种路由协议,用于在互联网中的不同自治系统(AS)之间交换路由信息。它…

Edge浏览器新特性深度解析,写作ai免费软件

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

运算符重载(2)

1.赋值运算符重载 #include<iostream> using namespace std;class Person { friend void test01(); public:Person(int age){m_Age new int(age);}/*堆区的数据由程序员手动开辟并手动释放*/~Person(){if (m_Age ! NULL){delete m_Age;}}Person& operator(Person &a…

如此建立网络根文件系统 Mount NFS RootFS

安静NFS系统服务 sudo apt-get install nfs-kernel-server 创建目录 sudo mkdir /rootfsLee 将buildroot编译的根文件系统解压缩到 sudo tar xvf rootfs.tar -C /rootfsLee/ 添加文件NFS访问路径 sudo vi /etc/exports sudo /etc/exports文件&#xff0c;添加如下一行 …

比 PSD.js 更强的下一代 PSD 解析器,支持 WebAssembly

比 PSD.js 更强的下一代 PSD 解析器&#xff0c;支持 WebAssembly 1.什么是 webtoon/ps webtoon/ps 是 Typescript 中轻量级 Adobe Photoshop .psd/.psb 文件解析器&#xff0c;对 Web 浏览器和 NodeJS 环境提供支持&#xff0c;且做到零依赖。 Fast zero-dependency PSD par…

创建SpringBoot和RabbitMQ的整合项目

文章目录 创建SpringBoot和RabbitMQ的整合项目首先快速创建一个maven项目引入SpringBoot整合rabbitMQ的依赖在src/main目录下创建resources目录并引入配置文件写消息发送者MessageSender写消息接收者MessageReceiver写RabbitMQConfig配置类写SpringBoot启动主类CommandLineRunn…

决策树模型示例

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个决策树模型pytorch程序,最后打印5个条件分别的影响力。 一 决策树模型是一种非参数监督学习方法&#xff0c;主要…

Java高阶私房菜:JVM垃圾回收机制及算法原理探究

目录 垃圾回收机制 什么是垃圾回收机制 JVM的自动垃圾回收机制 垃圾回收机制的关键知识点 初步了解判断方法-引用计数法 GCRoot和可达性分析算法 什么是可达性分析算法 什么是GC Root 对象回收的关键知识点 标记对象可回收就一定会被回收吗&#xff1f; 可达性分析算…
最新文章