我不想使用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');
ENDSELECT CASE似乎是在SQLite中使用CASE-clause的唯一方法,因为其他一切都会引发语法错误。但是也不可能在UPDATE或INSERT-statement中使用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提供一个使用的示例吗?
发布于 2013-12-02 11:02:54
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;发布于 2013-12-02 09:10:54
在这种情况下,您应该使用sqlite,并在应用程序中编写"IF逻辑“。
sqlite3_prepare16_v2(stmt1, "UPDATE t SET a=? WHERE id=?");
sqlite3_prepare16_v2(stmt2, "INSERT INTO t(id, a) VALUES(?, ?)");
for(...) // iterate by rows to be updated/inserted
{
//set parameter values for stmt1
sqlite3_step(stmt1);
if( !sqlite3_changes(dbh) )
{
//set parameter values for stmt2
sqlite3_step(stmt2);
}
}https://stackoverflow.com/questions/20323174
复制相似问题