SQLite插入或选择主键

时间:2012-03-20 20:45:14

标签: sql sqlite

我想插入一行(如果它尚不存在)。如果它已经存在,我想得到它的主键。 这可以在不使用两个查询的情况下完成,例如在列上使用UNIQUE约束和ON CONFLICT ...告诉我冲突行吗?

2 个答案:

答案 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