# 1.7.3 MySQL 如何处理约束

1.7.3.1 PRIMARY KEY 和 UNIQUE 索引约束

1.7.3.2 外键约束

1.7.3.3 对无效数据的强制约束

1.7.3.4 ENUM 和 SET 约束

MySQL 允许您使用允许回滚的事务表和不允许回滚的非事务表。因此,MySQL 中的约束处理与其他 DBMS 中的有些不同。当您在非事务性表中插入或更新大量行时,我们必须处理这种情况,这些行的更改在发生错误时无法回滚。

基本理念是 MySQL 服务器尝试在解析要执行的语句时为它可以检测到的任何内容产生错误,并尝试从执行语句时发生的任何错误中恢复。我们在大多数情况下都会这样做,但还不是全部。

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

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

以下部分描述 MySQL 服务器如何处理不同类型的约束。