【问题标题】:SQLite insert or select primary keySQLite 插入或选择主键
【发布时间】:2012-03-20 20:45:14
【问题描述】:

如果它不存在,我想插入一行。如果它已经存在,我想得到它的主键。 这可以在不使用两个查询的情况下完成吗,例如对列使用 UNIQUE 约束和 ON CONFLICT ... TELL ME THE CONFLICTING ROWID?

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

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

    我的建议是写你的INSERT,这样如果行存在,它就不会失败 - 它只是不会插入一行。像这样:

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

    这是有效的,因为如果选择已经存在,则不会返回一行。然后,您可以查看返回代码/状态以查看它是否 INSERTed 一行,或者只是 SELECT 具有唯一列,以获取标识列。

    不要依靠您的约束来捕捉这一点。约束是为了捕获应用程序错误,这只是一个业务/实现细节。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-10
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 2013-05-26
        • 2013-08-17
        • 2015-01-16
        相关资源
        最近更新 更多