在SQLite中的UPSERT

 saanenkim 发布于 2023-02-13 14:46

我不想使用,REPLACE INTO因为它基本上是一个DELETE而且INSERT使用旧列中的数据很复杂.

INSERT OR IGNORE 因为所有错误都被忽略了,所以这不是一个选择.

我读过一篇博文,其中使用了以下内容:

UPDATE Table1 SET (...) WHERE Column1='SomeValue'
IF @@ROWCOUNT=0
    INSERT INTO Table1 VALUES (...)

我非常喜欢这种方法,但我不知道如何IF-clause使用@@ROWCOUNTSQLite 实现这一点,这就是我得到的:

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似乎是使用的唯一方法CASE-clause在SQLite的,因为一切抛出一个语法错误.但它也不可能在中使用UPDATE- 或 - INSERT语句SELECT CASE,因此会引发错误.

我尝试了以下内容

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 的示例吗?

1 个回答
  • SQLite没有内置类似UPSERT的语句,不会删除旧记录.

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

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

    BEGIN;
    UPDATE t SET a = 'pdf' WHERE id = 2;
    INSERT INTO t(id, a) SELECT 2, 'pdf' WHERE changes() = 0;
    COMMIT;
    

    2023-02-13 14:49 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有