【问题标题】:How to do a insert or replace when the primary key will not be used不使用主键时如何进行插入或替换
【发布时间】:2013-10-20 14:56:11
【问题描述】:

我在需要 UUID 的多设备 android 系统上有一个 sqlite 数据库(是的,它需要它们),但是我没有将 UUID 设置为主键,而是 UUID 只是一个列,主键只是一个每个设备上的 INTEGER(未传输)而是在本地 android 数据库上自动生成

我正在根据 UUID 是否存在来执行更新(如果失败)插入例程 - 这非常慢,最终我想使用 SQLITESTATEMENT 将其转换为批量系统

但是,为了让我达到这一点,我需要使 INSERT OR REPLACE(或 REPLACE INTO)与我的数据集一起工作 - 据我了解,它仅在主键已经存在时才有效 - 因为我的主键不是我真正关心的如何使 Replace Into 基于不同的列工作? 或者也许我可以以不同的方式进行批量插入 - 不涉及替换成 - 但仍然可以处理插入或更新 -

感谢任何帮助

我一直在参考的一些项目 How do I UPDATE a row in a table or INSERT it if it doesn't exist?

http://www.buzzingandroid.com/2013/01/sqlite-insert-or-replace-through-contentprovider/

Improve INSERT-per-second performance of SQLite?

How do I use prepared statements in SQlite in Android?

http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html#execute() Android SQLite database: slow insertion

【问题讨论】:

    标签: android mysql database sqlite android-sqlite


    【解决方案1】:

    即使UUID不是主键也可以使用INSERT OR REPLACE,只要将UUID字段设为UNIQUE即可;

    CREATE TABLE test (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      uuid UUID UNIQUE NOT NULL
    );
    

    任何违反UNIQUE 约束的插入都会替换现有行(但会为新行生成新的主键)

    A very simple SQLfiddle to test with.

    【讨论】:

    • 太棒了 - 正是我想要的 - 也感谢你的 SQLfiddle - 一个方便的工具......这导致另一个问题但相关 - 我会用它来执行这个调用吗? developer.android.com/reference/android/database/sqlite/…
    • @morty346 我没有使用过那种方法,但是是的,它看起来确实是正确的方法。
    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 2013-08-11
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多