1.8.3.3 无效数据的约束

MySQL 5.7.5 和更高版本默认情况下使用严格的 SQL 模式,该模式会处理无效值,以便服务器拒绝它们并中止出现它们的语句(请参见第 5.1.10 节“服务器 SQL 模式”)。以前,MySQL 更原谅数据 Importing 中使用的错误值。现在,这要求禁用严格模式,不建议这样做。本节的其余部分讨论禁用严格模式时 MySQL 遵循的旧行为。

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

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

您可以使用STRICT_TRANS_TABLESSTRICT_ALL_TABLES SQL 模式选择对 Importing 值的更严格处理:

SET sql_mode = 'STRICT_TRANS_TABLES';
SET sql_mode = 'STRICT_ALL_TABLES';

STRICT_TRANS_TABLES为事务性存储引擎以及非事务性引擎启用严格模式。它是这样的:

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

使用任一严格模式选项,通过使用INSERT IGNOREUPDATE IGNORE而不是INSERTUPDATE不带IGNORE,可以将错误视为警告。

首页