2012-03-20 69 views
2

我想插入一行,如果它不存在。如果它已经存在,我想获得它的主键。 这可以在不使用两个查询的情况下完成,例如在列上使用UNIQUE约束,并在ON CONFLICT ...告诉冲突的ROWID?SQLite插入或选择主键

回答

1

请注意,我没有SQLite的经验。但是,在仔细阅读在线文档之后,我不相信它支持数据更改表引用,所以不,这是不可能的。

我的推荐是写INSERT这样的方式,它不会失败如果行存在 - 它只是不会插入一行。类似这样的:

INSERT INTO destinationTable (colA, colB) 
      (SELECT :colAValue, :colBValue 
      WHERE NOT EXISTS (SELECT '1' 
           FROM destinationTable 
           WHERE uniqueColumn = :uniqueColumn)) 

这是有效的,因为如果选择已经存在,选择将不会返回一行。然后,您可以查看返回代码/状态以查看是否使用INSERT编辑了一行,或者只使用SELECT与唯一列,以获取标识列。

不要依靠你的约束来抓住这个。约束条件是捕获应用程序错误,这仅仅是一个业务/实现细节。

1

总之,没有。你不能用SQLite插入数据,或者在某些情况下选择它。

其他SQL引擎可能会允许它,但SQLite不能。

你可以做的是INSERT OR IGNORE,它不会带来错误。见http://sqlite.org/lang_conflict.html