MySQL使您既可以使用允许回滚的事务表,也可以使用不允许回滚的非事务表。因此,MySQL中的约束处理与其他DBMS中的约束处理有所不同。当您在非事务处理表中插入或更新了很多行时,如果发生错误,则无法回滚更改,我们必须处理这种情况。

基本原理是,MySQL Server会尝试在分析要执行的语句时对其检测到的所有内容产生错误,并尝试从执行该语句时发生的任何错误中恢复。在大多数情况下,我们会这样做,但并非全部。

当发生错误时,MySQL具有的选项是在中间停止语句或从问题中尽可能恢复并继续。默认情况下,服务器遵循后面的过程。例如,这意味着服务器可以将无效值强制为最接近的有效值。

有几个SQL模式选项可用来更好地控制坏数据值的处理以及在发生错误时继续执行语句还是中止。使用这些选项,可以将MySQL Server配置为以更传统的方式运行,就像其他拒绝不正确输入的DBMS一样。可以在服务器启动时全局设置SQL模式,以影响所有客户端。各个客户端可以在运行时设置SQL模式,这使每个客户端可以选择最适合其要求的行为。请参见 第5.1.11节“服务器SQL模式”。

主键和唯一索引约束

通常,数据更改语句(例如INSERT或 UPDATE)会发生错误,这些错误 会违反主键,唯一键或外键约束。如果您使用事务存储引擎(例如) InnoDB,MySQL会自动回滚该语句。如果您使用的是非事务性存储引擎,则MySQL会在发生错误的行停止处理该语句,并保留所有未处理的行。

MySQL支持的IGNORE关键字 INSERT, UPDATE等。如果使用它,MySQL将忽略主键或唯一键冲突,并继续处理下一行。请参见本节中所使用的语句(第13.2.6节“ INSERT语法”, 第13.2.12节“ UPDATE语法”等)。

您可以获得有关使用mysql_info()C API函数实际插入或更新的行数的信息 。您也可以使用该SHOW WARNINGS语句。请参见 第28.7.7.36节“ mysql_info()”和 第13.7.7.40节“ SHOW警告语法”。

InnoDB和NDB表支持外键。请参见 第1.8.3.2节“外键约束”。

外部关键约束

外键使您可以跨表交叉引用相关数据, 外键约束有助于保持此扩展数据的一致性。

MySQL支持ON UPDATE和ON DELETE外键的引用 CREATE TABLE和 ALTER TABLE声明。可用参照动作RESTRICT, CASCADE,SET NULL,和 NO ACTION(默认值)。

SET DEFAULTMySQL服务器也支持,但目前被拒绝为无效服务器 InnoDB。由于MySQL不支持延迟约束检查,NO ACTION因此将其视为RESTRICT。有关MySQL支持外键的确切语法,请参见 第13.1.20.6节“使用外键约束”。

MATCH FULL,,MATCH PARTIAL和MATCH SIMPLE被允许,但应避免使用它们,因为它们会导致MySQL Server忽略同一语句中使用的任何ON DELETEor ON UPDATE子句。MATCHoptions在MySQL中没有任何其他作用,实际上会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 表上外键的信息也可以在数据库的INNODB_FOREIGN和 INNODB_FOREIGN_COLS表中找到 INFORMATION_SCHEMA。

InnoDB和NDB表支持外键。有关特定于外键支持的信息 ,请参见 第15.6.1.5节“ InnoDB和外键约束”InnoDB。

无效数据的约束

默认情况下,MySQL会接受无效或不正确的数据值,并将其强制为有效值以进行数据输入。但是,可以启用严格的SQL模式来选择更传统的错误值处理方式,以便服务器拒绝它们并中止发生错误的语句。请参见 第5.1.11节“服务器SQL模式”。

本节描述了MySQL的默认(宽容)行为,以及严格的SQL模式及其区别。

如果您未使用严格模式,则每当您在列中插入 “ 错误 ”值(例如 NULL在NOT NULL 列中插入a 或在数值列中插入太大的数值)时,MySQL都会将该列设置为“ 最佳可能值 ”而不是产生错误:以下规则更详细地描述了它是如何工作的:

如果您尝试将超出范围的值存储到数字列中,则MySQL Server会存储零,最小可能值或最大可能值,以最接近无效值的那个为准。

对于字符串,MySQL存储空字符串或该列中可以存储的尽可能多的字符串。

如果您尝试将不以数字开头的字符串存储到数字列中,则MySQL Server将存储0。

ENUM和 SET列的 无效值如第1.8.3.4节“ ENUM和SET约束”中所述处理。

MySQL允许您将某些不正确的日期值存储到DATE和 DATETIME列中(例如 '2000-02-31'或 '2000-02-00')。在这种情况下,如果应用程序未启用严格的SQL模式,则由应用程序来验证日期,然后再存储它们。如果MySQL可以存储日期值并检索完全相同的值,则MySQL按照给定的方式存储它。如果日期完全错误(服务器无法存储),则将特殊的“ 零 ”日期值 '0000-00-00'存储在该列中。

如果您尝试存储NULL到不带NULL值的列中,则单行INSERT语句会发生错误 。对于多行INSERT 语句或 INSERT INTO ... SELECT语句,MySQL Server存储列数据类型的隐式默认值。通常,这适用0于数字类型,''适用于字符串类型的空字符串(),适用于日期和时间类型的“ 零 ”值。第11.7节“数据类型默认值”中讨论了隐式默认值 。

如果INSERT语句没有为列指定任何值,则当列定义包含显式DEFAULT子句时,MySQL将插入其默认值 。如果定义中没有这样的DEFAULT子句,MySQL将为列数据类型插入隐式默认值。

在非严格模式下使用上述规则的原因是,在语句开始执行之前,我们无法检查这些条件。如果在更新几行后遇到问题,我们不能仅仅回滚,因为存储引擎可能不支持回滚。终止声明的选择不是那么好。在这种情况下,更新将 “ 完成一半 ”,这可能是最糟糕的情况。在这种情况下,最好“ 尽力而为 ”,然后继续进行,好像什么也没发生。

您可以使用STRICT_TRANS_TABLES或 STRICT_ALL_TABLESSQL模式选择对输入值的更严格处理 :

SET sql_mode = 'STRICT_TRANS_TABLES';

SET sql_mode = 'STRICT_ALL_TABLES';

STRICT_TRANS_TABLES对事务性存储引擎以及非事务性引擎在某种程度上启用严格模式。它是这样的:

对于事务存储引擎,语句中任何地方出现的错误数据值都会导致该语句中止并回滚。

对于非事务性存储引擎,如果在要插入或更新的第一行中发生错误,则语句中止。(当错误发生在第一行时,可以中止该语句以使表保持不变,就像事务表一样。)第一行之后的行中的错误不会中止该语句,因为该表已经被表更改了。第一排。相反,错误的数据值会被调整并导致警告而不是错误。换句话说, STRICT_TRANS_TABLES,错误的值会导致MySQL回滚到目前为止已完成的所有更新,如果可以这样做,而无需更改表。但是一旦更改了表格,其他错误将导致调整和警告。

要进行更严格的检查,请启用 STRICT_ALL_TABLES。这与STRICT_TRANS_TABLES非事务性存储引擎相同, 但即使对于第一行之后的行中的错误数据,错误也会中止该语句。这意味着,如果在非事务表的多行插入或更新过程中发生错误,则会导致部分更新。较早的行将被插入或更新,但是从错误的角度来看则不会。为避免非事务性表出现这种情况,请使用单行语句或使用 STRICT_TRANS_TABLES是否接受转换警告而不是错误。首先要避免出现问题,请勿使用MySQL检查列内容。让应用程序确保仅将有效值传递给数据库是最安全的(而且通常更快)。

无论使用哪种严格的模式选项,您可以通过使用引起的警告被视为错误 INSERT IGNORE或者UPDATE IGNORE,而不是INSERT或 UPDATE不 IGNORE。

ENUM和SET约束

ENUM和 SET列提供了一种有效的方式来定义只能包含一组给定值的列。请参见第11.4.4节“ ENUM类型”和 第11.4.5节“ SET类型”。

在启用严格模式的情况下(请参见第5.1.11节“服务器SQL模式”),a ENUM或 SETcolumn 的定义将作为对输入到该列中的值的约束。不满足以下条件的值会发生错误:

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'。

mysql添加枚举约束语句_mysql8 参考手册--MySQL如何处理约束相关推荐

  1. 支持mysql8的客户端_mysql8 参考手册--mysql客户端帮助

    mysql客户端帮助 mysql>help search_string 如果为help命令提供参数,则mysql将其用作搜索字符串,以从< MySQL参考手册>中提供帮助内容.该命令 ...

  2. mysql防火墙设置_mysql8 参考手册--MySQL企业防火墙配置参考

    MySQL企业防火墙表 MySQL企业防火墙维护帐户和白名单信息.它使用mysql系统数据库中的INFORMATION_SCHEMA表以持久形式存储此数据,并使用 表提供对缓存数据的视图.启用后,防火 ...

  3. mysql复合语句声明开始于_mysql8 参考手册--BEGIN ... END复合语句

    [begin_label:] BEGIN [statement_list] END [end_label] BEGIN ... END 语法用于编写复合语句,复合语句可以出现在存储程序(存储过程和函数 ...

  4. mysql install语句_mysql8 参考手册--INSTALL COMPONENT语句

    INSTALL COMPONENT component_name [, component_name ] ... 该语句安装一个或多个服务器组件,这些组件将立即变为活动状态.组件提供服务器和其他组件可 ...

  5. mysql中repair的用法_mysql8 参考手册--REPAIR TABLE语句

    REPAIR [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM] REP ...

  6. mysql通过订单量排序_mysql8 参考手册--通过排序优化

    本节描述了MySQL何时可以使用索引满足ORDER BY子句,无法使用索引时使用的 filesort操作,以及有关优化程序的执行计划信息ORDER BY. 一个ORDER BY有和没有 LIMIT可能 ...

  7. mysql 8 配置参数优化_mysql8 参考手册--配置非持久性优化器统计参数

    本节介绍如何配置非持久性优化器统计信息.当innodb_stats_persistent=OFF或使用创建或更改单个表时,Optimizer统计信息不会保留在磁盘 上 STATS_PERSISTENT ...

  8. MySQL可不可以直接定义程序_mysql8 参考手册-定义存储程序

    每个存储的程序都包含一个由SQL语句组成的主体.该语句可以是由多个用分号(;)字符分隔的语句组成的复合语句.例如,以下存储过程的主体由一个BEGIN ... END包含一个SET 语句的块 和一个RE ...

  9. mysql的Event权限_mysql8 参考手册-事件调度程序和MySQL特权

    要启用或禁用调度事件的执行,必须设置全局 event_scheduler系统变量的值.这需要足以设置全局系统变量的特权. 该EVENT特权控制事件的创建,修改和删除.可以使用授予该特权GRANT.例如 ...

最新文章

  1. BZOJ3473:字符串(后缀数组,主席树,二分,ST表)
  2. vue 过滤器的使用(解决forEach遇到的问题)
  3. 动态代理——事务处理
  4. 内向者优势 原版_未来内向的人具有越来越高的竞争力——心理学:学会运用性格优势...
  5. 如何利用扩展欧几里得算法求解不定方程_客户端不用的算法系列:从头条笔试题认识扩展欧几里得算法...
  6. linux系统调用函数---12
  7. 基于vue2.0打造移动商城页面实践 vue实现商城购物车功能 基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果...
  8. Web安全之权限攻击
  9. php教程 二叉树,PHP ClassObject -- PHP 自排序二叉树的深入解析
  10. mysql 联合主键_Mysql 创建联合主键
  11. 100 以内的数的研究
  12. 2017年最牛逼的分类Android项目源码免费一次性打包下载!
  13. 世嘉MD游戏开发【一】:win10环境下配置SGDK
  14. 学习笔记-安全-MAC地址攻击
  15. VS2019配置WinPcap开发
  16. 【华为电脑管家】打开多屏协同会自动修改微软拼音输入法兼容性的解决方案
  17. TOEFL wordlist 25
  18. Teredo Tunnel Adapter: Error Code 10
  19. 【转】四种主流温度传感器的优缺点比较
  20. ps计算机设置,做着ps电脑卡了怎么办 试试设置这四项

热门文章

  1. MySQL浮点数和定点数类型
  2. 谷歌浏览器mac_Mac用户浏览网页不可少的浏览器-谷歌Chrome
  3. python画圆形螺旋线_宝宝爱看小猪佩奇,很简单,让我们用python搞定它
  4. Java 技术之动态代理机制
  5. 2021-10-16 集合(set)与映射(map) 恋上数据结构笔记
  6. 鸿蒙系统gpl,华为鸿蒙最大的对手现身!谷歌正式推送Fuchsia OS,或替代安卓
  7. php9宫格抽奖程序_php抽奖算法(适用于九宫格、大转盘)
  8. c纳秒级计时器_使用C+提供以纳米秒为单位的时间的计时器功能
  9. java_opts gc回收器_JVM之垃圾回收机制(GC)
  10. 时问轴php,php-发布到时间轴-过去的日期