我不想使用,REPLACE INTO
因为它基本上是一个DELETE
而且INSERT
使用旧列中的数据很复杂.
INSERT OR IGNORE
因为所有错误都被忽略了,所以这不是一个选择.
我读过一篇博文,其中使用了以下内容:
UPDATE Table1 SET (...) WHERE Column1='SomeValue' IF @@ROWCOUNT=0 INSERT INTO Table1 VALUES (...)
我非常喜欢这种方法,但我不知道如何IF-clause
使用@@ROWCOUNT
SQLite 实现这一点,这就是我得到的:
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 的示例吗?
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;