MySQL如何处理约束

MySQL允许您同时使用支持回滚的事务表和不支持回滚的非事务表。因此,MySQL中的约束处理与其他数据库管理系统有所不同。当在非事务表中插入或更新了大量行时,并且在发生错误时无法回滚更改时,我们必须处理这种情况。

基本理念是,MySQL服务器在解析要执行的语句时会尽可能地检测出错误,并在执行语句时尝试恢复任何发生的错误。我们在大多数情况下都是如此处理的,但并不是所有情况下都可以做到。

当错误发生时,MySQL有两个选项:停止语句的执行或尽可能地从问题中进行恢复并继续执行。默认情况下,服务器会选择后者。这意味着,例如,服务器可能会将无效的值强制转换为最接近的有效值。

有多种SQL模式选项可用于更精确地控制如何处理错误数据值,以及在错误发生时是继续语句执行还是中止。通过使用这些选项,您可以配置MySQL服务器以更接近其他拒绝不当输入的DBMS的传统方式工作。SQL模式可以在服务器启动时全局设置,以影响所有客户端。各个客户端可以在运行时设置SQL模式,使每个客户端能够选择最适合其需求的行为。

以下几节将介绍MySQL Server如何处理不同类型的约束。

主键约束(PRIMARY KEY)和唯一索引约束(UNIQUE Index)

通常,对于可能违反主键约束、唯一键约束或外键约束的数据更改语句(如INSERT或UPDATE),会发生错误。如果您使用的是诸如InnoDB之类的事务性存储引擎,MySQL会自动回滚该语句。如果您使用的是非事务性存储引擎,MySQL会在出现错误的行处停止处理该语句,并保留其他未处理的行。

MySQL支持INSERT、UPDATE等语句中的IGNORE关键字。如果使用该关键字,在发生主键或唯一键冲突时,MySQL会忽略该错误,并继续处理下一行数据。

您可以借助mysql_info() C API函数来获取实际插入或更新的行数信息。您还可以使用SHOW WARNINGS语句来查看警告信息。

InnoDB和NDB表支持外键约束。

外键约束 

外键允许您在表之间进行相关数据的交叉引用,而外键约束有助于保持这些分散的数据的一致性。

MySQL在CREATE TABLE和ALTER TABLE语句中支持ON UPDATE和ON DELETE外键引用。可用的参照动作包括RESTRICT、CASCADE、SET NULL和NO ACTION(默认选项)。

MySQL Server支持SET DEFAULT,但在InnoDB中目前被拒绝为无效。由于MySQL不支持延迟约束检查,因此NO ACTION被视为RESTRICT。

允许使用MATCH FULL、MATCH PARTIAL和MATCH SIMPLE,但应尽量避免使用,因为它们会导致MySQL Server忽略同一语句中使用的任何ON DELETE或ON UPDATE子句。在MySQL中,MATCH选项没有其他影响,实际上全时强制执行MATCH SIMPLE语义。

MySQL要求对外键列进行索引;如果您创建一个具有外键约束但在某列上没有索引的表,将会自动创建索引。 

您可以从Information Schema KEY_COLUMN_USAGE表中获取有关外键的信息。下面是一个针对该表的查询示例:

mysql> SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME> FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE> WHERE REFERENCED_TABLE_SCHEMA IS NOT NULL;
+--------------+---------------+-------------+-----------------+
| TABLE_SCHEMA | TABLE_NAME    | COLUMN_NAME | CONSTRAINT_NAME |
+--------------+---------------+-------------+-----------------+
| fk1          | myuser        | myuser_id   | f               |
| fk1          | product_order | customer_id | f2              |
| fk1          | product_order | product_id  | f1              |
+--------------+---------------+-------------+-----------------+
3 rows in set (0.01 sec)

有关InnoDB表上的外键信息也可以在INFORMATION_SCHEMA数据库的INNODB_FOREIGN和INNODB_FOREIGN_COLS表中找到。

InnoDB和NDB表支持外键。

在无效数据上强制执行约束

默认情况下,MySQL 8.0会拒绝无效或不正确的数据值,并中止出现问题的语句。可以改变这种行为,使其更宽容地处理无效值,即服务器将其强制转换为有效值进行数据输入,方法是禁用严格的SQL模式,但这不被推荐。

旧版本的MySQL默认采用宽容的行为。

ENUM和SET约束 

ENUM和SET列提供了一种有效的方式来定义只能包含给定值集合的列。

除非禁用了严格模式,否则ENUM或SET列的定义将作为对输入到该列的值的约束。不满足这些条件的值会导致错误的发生: 

  • ENUM值必须是列定义中列出的值之一,或者是其内部的数值等价物。该值不能是错误值(即,0或空字符串)。对于定义为ENUM('a','b','c')的列,像''、'd'或'ax'这样的值是无效的,并且会被拒绝。
  • SET值必须是空字符串或仅由以逗号分隔的列定义中列出的值组成。对于定义为SET('a','b','c')的列,像'd'或'a,b,c,d'这样的值是无效的,并且会被拒绝。

如果在严格模式下使用INSERT IGNORE或UPDATE IGNORE,可以抑制无效值的报错。在这种情况下,将生成一个警告而不是错误。对于ENUM,值会以错误成员(0)的形式插入。对于SET,值会按照给定的值插入,但会删除任何无效的子字符串。例如,'a,x,b,y' 的结果是 'a,b'。 

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

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

相关文章

SpringBootAdmin邮件通知

在上一篇中我们学习到了 Admin Service Clustering 分布式缓存配置 ,这一篇我们来学习,客户端离线,出现故障的时候,我们这么能及时知道呢,发现邮件通知也许是最简单的方式了! 邮件通知 邮件通知将作为使用…

数据结构 | 数组

数组是一种用连续空间存储相同数据类型的线性数据结构 为什么数组的索引从0开始,从1开始不行吗? 寻址公式是: 数组首地址 索引 * 数据类型占用的字节 从0开始性能更好,从1开始,cpu会多一个减法运算。 查找数据的时…

Linux文本编辑器-vi/vim

一.vi/vim编辑器介绍 vi\vim是visual interface的简称, 是Linux中最经典的文本编辑器 同图形化界面中的 文本编辑器一样,vi是命令行下对文本文件进行编辑的绝佳选择。 vim 是 vi 的加强版本,兼容 vi 的所有指令,不仅能编辑文本,而…

GBASE南大通用分享如何更新嵌套的集合

如果您想要更新集合的集合,则必须声明游标来访问外层的集合,然后声明嵌套的游标来 访问内层的集合。 例如,假设 manager 表有一附加的列 scores,它包含一其元素类型为整数的 MULTISET 的 LIST,如下图所示。 更新集合…

哈希的基本概念(开散列和闭散列)(附代码)

哈希 哈希概念哈希冲突哈希函数常见的哈希函数 哈希冲突的解决闭散列开散列 哈希概念 传统的查找函数,搜索的效率取决于比较的次数。而hash算法:在理想情况下,可以不经过任何比较,一次就能得到要搜索的结果。 存储结构&#xff1…

面向社交网络语言隐写分析

论文:Linguistic Steganalysis Toward Social Network 发表在:IEEE Transactions on Information Forensics & Security是网络与信息安全领域的国际两大顶级期刊之一,中国计算机学会(CCF)推荐的A类期刊&#xff0c…

​用技术的视角,去看一台家用 MPV 该有的水准

「MPV」一个在 2023 年之前都属于「小众」车型的品类。 但从 2023 年初开始,MPV 却变成了新能源,特别是高端新能源品牌必争的细分产品。 从岚图推梦想家开始,到腾势 D9,再到极氪 009,最后到魏牌高山,标志…

【开源】基于JAVA语言的智慧社区业务综合平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 业务类型模块2.2 基础业务模块2.3 预约业务模块2.4 反馈管理模块2.5 社区新闻模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 业务类型表3.2.2 基础业务表3.2.3 预约业务表3.2.4 反馈表3.2.5 社区新闻表 四、系统展…

Java中的this和super

①this 在Java中,this关键字代表当前对象的引用。它可以用于以下几个方面: 引用当前对象的成员变量:使用this关键字可以引用当前对象的成员变量,以区分成员变量和方法参数或局部变量之间的命名冲突。例如,如果一个方法…

C++学习笔记--运算符

运算符 作用:用于执行代码的运算 运算符的类型 1、算术运算符 作用:处理四则运算 2、赋值运算符 作用:用于将表达式的值赋给变量 3、比较运算符 作用:用于表达式的比较,并返回一个真值或阙值 4、逻辑运算符…

LeetCode做题总结 226. 翻转二叉树

226. 翻转二叉树 代码1 报错代码2 报错代码3 正确。 代码1 报错 class Solution {public TreeNode invertTree(TreeNode root) {// TreeNode _root root; // 这是在保证// _root preOrderTree(root);// return root;root preOrderTree(root);return root;}public TreeNode …

【机器学习300问】15、什么是逻辑回归模型?

一、逻辑回归模型是为了解决什么问题? 逻辑回归(Logistic Regression)是一种广义线性回归分析模型,尤其适用于解决二分类问题(输出为两个类别)。 (1)二分类举例 邮件过滤&#xff…

Java Web(五)--DOM

介绍 DOM 全称是 Document Object Model 文档对象模型; DOM 是 W3C(万维网联盟)的标准。 DOM 定义了访问 HTML 和 XML 文档的标准: "W3C 文档对象模型 (DOM) 是中立于平台和语言的接口&#xff0…

pdf怎么转换成jpg图片?pdf转图片工具用它就够了

有时候,我们可能需要将pdf文档转换为图片格式,以便于文档的处理和管理。通过将pdf转换为图片,可以将每一页pdf转换为独立的图片文件,便于整理、存储和管理,如果您有多个PDF文件需要转换成图片,可以批量pdf转…

Modern C++ std::bind的实现原理

1. 前言 前面写过《std::function从实践到原理》,管中规豹了std::function的一点点原理,不过还有一个与std::function密切相关的函数std::bind, 允许编程者绑定几个参数,本文着重介绍它的实现原理。不介绍一下它,有点吃肉不吃蒜味…

npm安装卡住问题(最新版)

npm安装卡住问题(最新版) 背景: ​ 最近这两天用npm安装一些包的时候,发现一直卡住: 报错: idealTree:npm: sill idealTree buildDeps之前能用的现在不能用了,我一想,是不是源头的问题,还真是…

C语言每日一题(48)回文链表

力扣 234 回文链表 题目描述 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2&#xff1…

Redis性能运行参数的监测工具 - WGCLOUD

WGCLOUD是一款开源免费的运维监控平台,可以监测Redis的运行情况,比如redis的Key数量,过期Key数量,Redis的端口号,Redis的版本,同步状态,集群模式,使用内存等等数据 中间件Redis监测…

【前端基础--3】

文字样式 1.文字颜色 color 取值方式: 英文单词 red green blue十六进制的颜色值 #000000 也可以写为#000(如aabbcc可以简写为abc)rgb三原色取值 color:rgb(220,32,215) 取值范围都在0~255之间 2.文字大小 font-size …

FinBert模型:金融领域的预训练模型

文章目录 模型及预训练方式模型结构训练语料预训练方式 下游任务实验结果实验一:金融短讯类型分类实验任务数据集实验结果 实验二:金融短讯行业分类实验任务数据集实验结果 实验三:金融情绪分类实验任务数据集实验结果 实验四:金融…