ON CONFLICT clause
SQL As Understood By SQLite
[Top]
ON CONFLICT clause
conflict-clause:
hide
ON CONFLICT 子句不是单独的 SQL 命令。这是一个非标准的子句,可以出现在许多其他 SQL 命令中。它在本文中被赋予它自己的部分,因为它不是标准 SQL 的一部分,因此可能不熟悉。
ON CONFLICT 子句的语法如上面的 CREATE TABLE 命令所示。对于 INSERT 和 UPDATE 命令,关键字 “ON CONFLICT” 被替换为 “OR”,以便语法更自然地阅读。例如,而不是 “INSERT ON CONFLICT IGNORE”,我们有 “INSERT 或 IGNORE”。关键字会发生变化,但该条款的含义也是相同的。
ON CONFLICT 子句适用于 UNIQUE,NOT NULL,CHECK 和 PRIMARY KEY 约束。ON CONFLICT 算法不适用于 FOREIGN KEY 约束。有五种冲突解决算法选择:ROLLBACK,ABORT,FAIL,IGNORE 和 REPLACE。默认的冲突解决算法是 ABORT。这就是他们的意思:
ROLLBACK
当发生适用的约束冲突时,ROLLBACK 解析算法会使用 SQLITE_CONSTRAINT 错误中止当前 SQL 语句并回滚当前事务。如果没有事务处于活动状态(除了在每个命令上创建的隐含事务),则 ROLLBACK 解析算法与 ABORT 算法的工作方式相同。
ABORT
当发生适用的约束违规时,ABORT 解析算法会使用SQLITE_CONSTRAINT 错误中止当前的 SQL 语句,并将当前 SQL 语句所做的任何更改置备; 但是由同一事务内的先前 SQL 语句引起的更改将保留并且事务保持活动状态。这是 SQL 标准指定的默认行为和行为。
FAIL
当发生适用的约束违规时,FAIL 解析算法会使用 SQLITE_CONSTRAINT 错误中止当前的 SQL 语句。但 FAIL 解决方案不会退出先前发生故障的 SQL 语句更改,也不会结束事务。例如,如果 UPDATE 语句在第100行尝试更新时遇到违反约束的情况,则保留前99行更改,但不会发生对第100行更改的更改。
IGNORE
当发生适用的约束违规时,IGNORE 解析算法将跳过包含违反约束的一行,并继续处理 SQL 语句的后续行,就像没有出错一样。包含违反约束的行之前和之后的其他行通常会被插入或更新。使用 IGNORE 冲突解决算法时不返回错误。
REPLACE
当发生 UNIQUE 或 PRIMARY KEY 约束冲突时,REPLACE 算法将删除在插入或更新当前行之前导致违反约束的预先存在的行,并且该命令将继续正常执行。如果发生 NOT NULL 约束冲突,则 REPLACE 冲突解决方法将 NULL 值替换为该列的默认值,或者如果该列没有默认值,则使用 ABORT 算法。如果发生 CHECK 约束冲突,REPLACE 冲突解决算法总是像 ABORT 一样工作。
当 REPLACE 冲突解决策略删除行以满足约束时,当且仅当启用递归触发器时删除触发器才会触发。
对于由 REPLACE 冲突解决策略删除的行,不会调用更新挂钩。REPLACE 也不会增加更改计数器。本段定义的特殊行为可能会在未来版本中发生变化。
在 INSERT 或 UPDATE 的 OR 子句中指定的算法将覆盖 CREATE TABLE 中指定的任何算法。如果没有指定算法,则使用 ABORT 算法。