我不想使用REPLACE INTO
,因为它基本上是DELETE
和INSERT
,并且使用旧列中的数据很复杂。INSERT OR IGNORE
有点骇人听闻,因为所有错误都会被忽略,因此这不是一个选择。
我已阅读使用以下内容的blog article:
UPDATE Table1 SET (...) WHERE Column1='SomeValue'
IF @@ROWCOUNT=0
INSERT INTO Table1 VALUES (...)
我非常喜欢这种方法,但是我不知道如何用SQLite中的
IF-clause
实现此@@ROWCOUNT
,这就是我得到的: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
的唯一方法,因为其他所有内容都会引发语法错误。但是也不能在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
会引发语法错误。有人可以提供在SQLite中将
@@ROWCOUNT
用于UPSERT的示例吗? 最佳答案
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;