根据id插入或更新SQLite表

时间:2016-09-01 15:13:16

标签: sqlite upsert

我有一个像这样的SQLite表:

CREATE TABLE test (id int PRIMARY KEY, Name text, Country text, ..., ...)

我正在获取此表的数据,可以更改列值,id除外。所以,如果那里没有特定的id,我想插入,但是,我想用id更新带有新值的记录。

我试过这个:

INSERT OR IGNORE INTO test (id, Name, ..., ...) VALUES (?,?, ....)"

这不会创建重复的id's - 这很好 - 但如果表中已存在id,则它不会更新记录的其余部分。

我希望避免对SELECT使用id并检查它是否存在,然后相应地更新或插入。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用INSERT OR REPLACE。这将首先尝试插入行,如果与id发生冲突,它将删除旧行并再次尝试插入。

INSERT OR REPLACE的缺点是你必须为每个" upsert"指定行的所有字段。操作。如果这对您不起作用,那么唯一的选择是SELECT后跟INSERTUPDATE。你确实说过你不喜欢这样,但在sqlite中,这并不像其他RDBMS那么糟糕; sqlite是嵌入式RDBMS而不是客户端 - 服务器RDBMS,因此与执行多个此类操作相关的成本要小得多。不要忘记在事务中包装这两个操作。

答案 1 :(得分:1)

您可以尝试UPDATE,如果没有实际更新记录,请执行INSERT:

ContentValues cv = new ContentValues();
cv.put("Name", ...);
if (db.update("test", cv, "id = " + myID, null) < 1) {
    cv.put("id", myID);
    db.insert("test", null, cv);
}