【发布时间】:2012-03-20 20:45:14
【问题描述】:
如果它不存在,我想插入一行。如果它已经存在,我想得到它的主键。 这可以在不使用两个查询的情况下完成吗,例如对列使用 UNIQUE 约束和 ON CONFLICT ... TELL ME THE CONFLICTING ROWID?
【问题讨论】:
如果它不存在,我想插入一行。如果它已经存在,我想得到它的主键。 这可以在不使用两个查询的情况下完成吗,例如对列使用 UNIQUE 约束和 ON CONFLICT ... TELL ME THE CONFLICTING ROWID?
【问题讨论】:
请注意,我没有使用 SQLite 的经验。但是,仔细阅读在线文档后,我不认为它支持数据更改表引用,所以不,这是不可能的。
我的建议是写你的INSERT,这样如果行存在,它就不会失败 - 它只是不会插入一行。像这样:
INSERT INTO destinationTable (colA, colB)
(SELECT :colAValue, :colBValue
WHERE NOT EXISTS (SELECT '1'
FROM destinationTable
WHERE uniqueColumn = :uniqueColumn))
这是有效的,因为如果选择已经存在,则不会返回一行。然后,您可以查看返回代码/状态以查看它是否 INSERTed 一行,或者只是 SELECT 具有唯一列,以获取标识列。
不要依靠您的约束来捕捉这一点。约束是为了捕获应用程序错误,这只是一个业务/实现细节。
【讨论】:
总之,没有。您不能使用 SQLite 插入数据,或者在某些情况下选择它。
其他 SQL 引擎可能允许,但 SQLite 不能。
你可以做的是INSERT OR IGNORE,它不会出现错误。见http://sqlite.org/lang_conflict.html
【讨论】: