【发布时间】:2013-12-17 20:36:35
【问题描述】:
我不想使用REPLACE INTO,因为它基本上是DELETE 和INSERT,而且使用旧列中的数据很复杂。
INSERT OR IGNORE 有点小技巧,因为所有错误都会被忽略,所以这不是一个选项。
我读过blog article,它使用以下内容:
UPDATE Table1 SET (...) WHERE Column1='SomeValue'
IF @@ROWCOUNT=0
INSERT INTO Table1 VALUES (...)
我非常喜欢这种方法,但我不知道如何在 SQLite 中用@@ROWCOUNT 实现这个IF-clause,这就是我得到的:
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 的唯一方法,因为其他所有内容都会引发语法错误。但是也不能在SELECT CASE 中使用UPDATE- 或INSERT- 语句,所以这会引发错误。
我尝试了以下方法
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 的示例?
【问题讨论】:
-
@@ROWCOUNT是 SQLite 中没有的 T-SQL 功能,SQLite 也没有您尝试使用的 IF 或 CASE 语句。如果您确实需要 UPSERT,您可能需要接受“这很复杂”,并使用 solution given in question 418898 或从应用程序代码中检查SELECT changes()的结果并基于此执行 INSERT。 -
@@ROWCOUNT是从我参考的那篇博客文章中借来的,表达不好见谅。我喜欢SELECT changes()的想法,谢谢