我想插入一行(如果它尚不存在)。如果它已经存在,我想得到它的主键。 这可以在不使用两个查询的情况下完成,例如在列上使用UNIQUE约束和ON CONFLICT ...告诉我冲突行吗?
答案 0 :(得分:1)
请注意,我没有使用SQLite的经验。但是,在仔细阅读在线文档后,我不认为它支持数据更改表引用,所以不,这是不可能的。
我的建议是以这样一种方式编写你的INSERT
,如果行存在它将不会失败 - 它只是不会插入一行。像这样:
INSERT INTO destinationTable (colA, colB)
(SELECT :colAValue, :colBValue
WHERE NOT EXISTS (SELECT '1'
FROM destinationTable
WHERE uniqueColumn = :uniqueColumn))
这是有效的,因为如果选择已经存在,则选择不会返回一行。然后,您可以查看返回代码/状态以查看它是INSERT
行,还是只有SELECT
的唯一列,以获取标识列。
不要依靠你的约束来捕获它。约束是捕获应用程序错误,这仅仅是业务/实现细节。
答案 1 :(得分:1)
总之,没有。对于SQLite,你不能INSERT数据,或者在某些情况下,SELECT它。
其他SQL引擎可能允许它,但SQLite不能。
你可以做的是INSERT OR IGNORE
,这不会引起错误。见http://sqlite.org/lang_conflict.html