【问题标题】:SQLite: how does REPLACE INTO determine if a row exists?SQLite:REPLACE INTO 如何判断一行是否存在?
【发布时间】:2012-09-11 17:32:33
【问题描述】:

我发现 this post 解释了 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”的字段或字段名称行中的第一个字段进行特殊处理?

【问题讨论】:

    标签: sqlite insert replace indexing


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好的,所以 SQLite 不使用任何列来选择它将尝试更新的特定行。它只是尝试添加一条记录,如果由于约束而失败,那么它将尝试更新导致约束生效的任何记录。
    猜你喜欢
    • 2013-05-12
    • 2013-10-02
    • 2021-07-26
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多