首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLite中的UPSERT

SQLite中的UPSERT
EN

Stack Overflow用户
提问于 2013-12-02 07:45:12
回答 2查看 8.9K关注 0票数 3

我不想使用REPLACE INTO,因为它基本上是一个DELETEINSERT,使用旧列的数据很复杂。

INSERT OR IGNORE有点麻烦,因为所有的错误都会被忽略,所以这不是一个选项。

我读过一个博客文章,它使用以下内容:

代码语言:javascript
复制
UPDATE Table1 SET (...) WHERE Column1='SomeValue'
IF @@ROWCOUNT=0
    INSERT INTO Table1 VALUES (...)

我非常喜欢这种方法,但是我不知道如何用IF-clause中的@@ROWCOUNT实现这个SQLite,这就是我得到的:

代码语言:javascript
复制
SELECT CASE (SELECT
    CASE
        WHEN EXISTS(SELECT 1 FROM t WHERE id=2)
            THEN 1
            ELSE 0
    END)
WHEN 1
  UPDATE t set a='pdf' WHERE id=2;
ELSE
  INSERT INTO t (a) VALUES ('pdf');
END

SELECT CASE似乎是在SQLite中使用CASE-clause的唯一方法,因为其他一切都会引发语法错误。但是也不可能在UPDATEINSERT-statement中使用SELECT CASE,因此这会引发一个错误。

我试过以下几种方法

代码语言:javascript
复制
UPDATE t set a='pdf' WHERE id=2;
CASE WHEN (changes()=0) THEN
    INSERT INTO t (a) VALUES ('pdf');
END

但是这不起作用,因为CASE-clause抛出了一个语法错误。

@@ROWCOUNT可以为SQLite?中的UPSERT提供一个使用的示例吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-02 11:02:54

SQLite没有内置的不删除旧记录的UPSERT类语句。

您应该检查程序中更改的数量,并有条件地执行INSERT。

但是,如果您真的想在SQL中这样做,这是可能的;但是您必须使用INSERT ... SELECT ...表单,以便您能够插入零记录,如果需要的话:

代码语言:javascript
复制
BEGIN;
UPDATE t SET a = 'pdf' WHERE id = 2;
INSERT INTO t(id, a) SELECT 2, 'pdf' WHERE changes() = 0;
COMMIT;
票数 11
EN

Stack Overflow用户

发布于 2013-12-02 09:10:54

在这种情况下,您应该使用sqlite,并在应用程序中编写"IF逻辑“。

代码语言:javascript
复制
sqlite3_prepare16_v2(stmt1, "UPDATE t SET a=? WHERE id=?");

sqlite3_prepare16_v2(stmt2, "INSERT INTO t(id, a) VALUES(?, ?)");

for(...) // iterate by rows to be updated/inserted
{
    //set parameter values for stmt1

    sqlite3_step(stmt1);
    if( !sqlite3_changes(dbh) )
    {
        //set parameter values for stmt2
        sqlite3_step(stmt2);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20323174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档