Sqlite Mono upsert

本文关键字:upsert Mono Sqlite | 更新日期: 2023-09-27 18:02:28

根据这里类似问题的各种示例,我试图在mono中使用sqlite组合一个upsert。

string query = string.Format(@"
                    UPDATE {0} SET data=@data, protoent=@protoent, posX=@pX, posY=@pY, posZ=@pZ, ownerpubkey=@ownerpubkey WHERE key=@key;
                    INSERT INTO {0} (key, data, protoent, posX, posY, posZ, ownerpubkey) VALUES (@key, @data, @protoent, @pX, @pY, @pZ, @ownerpubkey) WHERE changes() = 0;
                    ", PersistEntityRecord.TableName);

由于某种原因,我得到了一个异常,因为它似乎不像INSERT行

的WHERE部分
Exception thrown: 'Mono.Data.Sqlite.SqliteException' in Mono.Data.Sqlite.dll
Additional information: SQLite error
near "WHERE": syntax error

如果我删除INSERT行上的WHERE,它将运行。我不知道为什么不像那部分。

SqliteConnection。如果有帮助的话,SQLiteVersion报告版本3.11.0

谢谢

Sqlite Mono upsert

INSERT语句有两种形式。WHERE子句只能在使用SELECT查询指定要插入的值的形式中使用:

UPDATE {0}
SET data=@data, protoent=@protoent, posX=@pX, posY=@pY, posZ=@pZ, ownerpubkey=@ownerpubkey
WHERE key=@key;
INSERT INTO {0} (key, data, protoent, posX, posY, posZ, ownerpubkey)
SELECT @key, @data, @protoent, @pX, @pY, @pZ, @ownerpubkey
WHERE changes() = 0;

在代码中执行逻辑可能更容易:

execute("UPDATE ...");
if (connection.Changes == 0) {
    execute("INSERT ...");
}