2

我发现这篇文章解释了 UPDATE 和“INSERT OR REPLACE INTO”之间的区别。它解释说

INSERT OR REPLACE INTO names (id, name) VALUES (1, "John")

如果不存在 id = 1 的记录,则插入新行,如果存在,则替换 id = 1 的行。我的问题是:SQLite 如何知道或决定“id”是其值确定记录是否已经存在的字段?

换句话说,为什么 sqlite 不搜索 name = "John" 的记录并替换 id 值?这是否取决于上面示例中未提及的索引,或者 SQLite 是否对名为“id”的字段或字段名称行中的第一个字段进行特殊处理?

4

1 回答 1

4

有关如何处理的信息,请参阅CONFLICT条款文档。本质上,它基于 UNIQUE 和 NOT NULL 约束(主键通常作为选择是否更新或插入的约束)。

当发生 UNIQUE 约束违规时,REPLACE 算法会在插入或更新当前行之前删除导致约束违规的预先存在的行,并且命令会继续正常执行。如果发生 NOT NULL 约束违规,则 REPLACE 冲突解决方案将 NULL 值替换为该列的默认值,或者如果该列没有默认值,则使用 ABORT 算法。如果发生 CHECK 约束冲突,则 REPLACE 冲突解决算法始终像 ABORT 一样工作。

当 REPLACE 冲突解决策略删除行以满足约束时,当且仅当启用递归触发器时,删除触发器才会触发。

对于由 REPLACE 冲突解决策略删除的行,不会调用更新挂钩。REPLACE 也不会增加更改计数器。本段中定义的异常行为可能会在未来的版本中发生变化。

于 2012-09-11T09:32:33.643 回答