【问题标题】:How to do SQL Insert or Replace like operation without changing primary key?如何在不更改主键的情况下进行 SQL 插入或替换操作?
【发布时间】:2011-07-10 13:43:51
【问题描述】:

我正在尝试向 SQLite 数据库表中插入一条记录。该表对“URL”列和主键自动递增整数“_id”具有唯一约束。

我使用插入或替换作为我的冲突解决方案,因为我需要保留新数据。但是,这种方法会增加主键并弄乱其他表中的一些外键。

在不更新 _id 的情况下覆盖记录的最佳方法是什么?

【问题讨论】:

  • 我只需要在违反唯一约束时更新,这就是为什么插入或替换如此方便的原因。有没有简单的方法来检查这些约束?
  • “我正在使用插入或替换作为我的冲突解决方案。”这是什么意思?您是否通过删除旧记录然后插入新记录来更新这些记录?

标签: android sql database sqlite


【解决方案1】:

简单的答案是停止使用替换语法。这会导致旧记录被删除,然后添加新记录...这会增加您的索引。

改用 UPDATE 语法来处理冲突

编辑:

如果您真的偏爱 Replace 语法,那么这将是有代价的。您将需要编写额外的代码,将所有先前出现的旧索引更新为新索引。不是太难,但这将纠正同步索引的问题

文档 [列在页面下方的 REPLACE 部分]:http://www.sqlite.org/lang_conflict.html

【讨论】:

  • 很高兴了解替换。我不知道这一点。文档中是否有页面说明了这一点?
  • @Kevin Peno 这是 SQLite 的文档 .. 可能更合适,似乎是从一般的 sql 标准继承的一组语法。 sqlite.org/lang_conflict.html它在“REPLACE”的粗体部分下列出
【解决方案2】:

这是我的 SQLite 代码

"CREATE TABLE IF NOT EXISTS posts (" +
"_id integer NOT NULL," +
"id_language integer NOT NULL" +
");" +
"CREATE UNIQUE INDEX posts_idx ON posts(_id, id_language);";


"INSERT OR REPLACE INTO " + DB_TABLE + " (" + formulateColumns() + ") " +
            "VALUES (" + formulateValues(v) + ");");

【讨论】:

    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2020-08-03
    • 2019-11-22
    • 2019-12-22
    • 1970-01-01
    相关资源
    最近更新 更多