# 严格模式

__*严格 SQL_MODE*__
__*STRICT_TRANS_TABLES*__
__*STRICT_ALL_TABLES*__

+ STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES: TiDB 即处于严格模式状态
+ 未启用严格模式时,TiDB 会根据表结构和约束条件转换无效值
  + 在添加、替换或更新现有数据时会进行转换:
  + TiDB 将无效值调整为最接近的有效值
    + 生成警告,您可以使用该警告: `SHOW WARNINGS` 
+ 在严格模式下,TiDB 会生成错误并中止语句
------------------------------------------------------------------------------

TiDB 在提供无效数据时通常比许多传统数据库系统更宽容。例如,如果您在 UNSIGNED 列中写入负值,TiDB 会将其转换为零,这是该列数据类型最接近的合法值。在严格模式下,服务器拒绝超出范围、数据类型不正确或没有默认值的列缺失的值。

如果在使用事务表（例如使用默认存储引擎 InnoDB 创建的表）时生成错误并启用 STRICT_TRANS_TABLES,则语句将中止。

对于非事务表,如果错误发生在插入操作的第一行（或唯一一行）,TiDB 会中止该语句。如果在第二次或以后的插入中出现错误,TiDB 会将任何无效值调整为合法值,然后将其插入,并仅生成警告。这是因为之前的插入是成功的。

STRICT_ALL_TABLES 与 STRICT_TRANS_TABLES 类似,但对于非事务性表,即使在多行插入的第二行或更高行中出现错误,它也会导致语句中止。这可能会导致部分更新。为了避免在使用 STRICT_ALL_TABLES 时出现这种情况,必须使用可以在不更改表的情况下中止的单行语句。
注意:本课程在标题为 "事务" 的课程中介绍事务处理。

- STRICT_TRANS_TABLES: 严格模式,对数据进行严格校验,当数据出现错误时,插入到表中,并且返回错误。
  - STRICT_TRANS_TABLES	对于事务存储引擎启用严格模式,insert非法值之后,回滚整条语句（支持）
  - STRICT_ALL_TABLES	对于事务型表,写入非法值之后,回滚整个事务语句（支持）