mysql约束有效无效_MySQL 无效数据约束

[广告:最高 ¥2000 红包]阿里云服务器、主机等产品通用,可叠加官网常规优惠使用 | 限时领取

默认情况下,MySQL可以容忍无效或不正确的数据值,并将它们强制为有效的数据输入值。好在,你可以为不良值选择更传统的处理方法,从而使得服务器能够拒绝并放弃出现不良值的语句。请参见 第5.1.11节“服务器SQL模式”。

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

如果您没有使用严格模式,那么无论何时向列中插入 “ 不正确 ”值,例如 NULL将NOT NULL 列插入到列中或将过大的数值插入数字列,MySQL都会将列设置为“ 最佳可能值 ”而不是产生错误:以下规则更详细地描述了它的工作原理:

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

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

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

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_TRANS_TABLES,如果可以在不更改表的情况下完成,则错误的值会导致MySQL回滚到目前为止所做的所有更新。但是一旦表格被更改,进一步的错误会导致调整和警告。

要想执行更严格的检查,请启用STRICT_ALL_TABLES。除了非事务性存储引擎,它与STRICT_TRANS_TABLES等同,即使当不良数据出现在首行后的其他行,所产生的错误也会导致放弃语句。这意味着,如果错误出现在非事务性表多行插入或更新过程的中途,仅更新部分结果。前面的行将完成插入或更新,但错误出现点后面的行则不然。对于非事务性表,为了避免这种情况的发生,可使用单行语句,或者在能接受转换警告而不是错误的情况下使用STRICT_TRANS_TABLES。要想在第1场合防止问题的出现,不要使用MySQL来检查列的内容。最安全的方式(通常也较快)是,让应用程序负责,仅将有效值传递给数据库。

有了严格的模式选项后,可使用INSERT IGNORE或UPDATE IGNORE而不是不带IGNORE的INSERT或UPDATE,将错误当作告警对待。

e6ebcd183430c87e61a73a5444f7c342.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值