我不想使用REPLACE INTO它,因为它基本上是a DELETE,INSERT并且使用旧列中的数据很复杂。
REPLACE INTO
DELETE
INSERT
INSERT OR IGNORE 有点骇人听闻,因为所有错误都会被忽略,因此这不是一种选择。
INSERT OR IGNORE
我已经阅读了一篇使用以下内容的博客文章
UPDATE Table1 SET (...) WHERE Column1='SomeValue' IF @@ROWCOUNT=0 INSERT INTO Table1 VALUES (...)
我喜欢这种方法真的很多,但我不知道我怎样才能实现这个IF-clause用@@ROWCOUNT在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似乎是使用的唯一方法CASE- clause在SQLite的,因为一切抛出一个语法错误。但是在中也不能使用UPDATE-或-INSERT语句SELECT CASE,因此会引发错误。
SELECT CASE
CASE- clause
UPDATE
我尝试了以下
UPDATE t set a='pdf' WHERE id=2; CASE WHEN (changes()=0) THEN INSERT INTO t (a) VALUES ('pdf'); END
但这不起作用,因为CASE-clause抛出语法错误。
CASE-clause
有人可以提供@@ROWCOUNT在SQLite中使用UPSERT的示例吗?
SQLite没有内置的类似UPSERT的语句,该语句不会删除旧记录。
您应该检查程序中的更改数量,并有条件地执行INSERT。
但是,如果您真的想在SQL中执行此操作,则可以这样做。但是您必须使用INSERT ... SELECT ...表格,以便在需要时可以插入零条记录:
INSERT ... SELECT ...
BEGIN; UPDATE t SET a = 'pdf' WHERE id = 2; INSERT INTO t(id, a) SELECT 2, 'pdf' WHERE changes() = 0; COMMIT;