Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sqlite3-更新冲突主键_Sqlite - Fatal编程技术网

sqlite3-更新冲突主键

sqlite3-更新冲突主键,sqlite,Sqlite,我有一个具有名称-值对的下表 CREATE TABLE settings (id integer primary key, name text unique, val integer); 名称是唯一的。我希望id增加,并且当name冲突且val已更改时,更新val。如果行没有更改(例如,相同的名称和val),则id应保持不变 因为我们需要一次插入大量的行,所以我们需要使用批量插入(强制) 我尝试使用insert或replace,但它似乎在改变id,即使行没有改变 sqlite> inse

我有一个具有名称-值对的下表

CREATE TABLE settings (id integer primary key, name text unique, val integer);
名称
是唯一的。我希望
id
增加,并且当
name
冲突且
val
已更改时,更新
val
。如果行没有更改(例如,相同的
名称
val
),则
id
应保持不变

因为我们需要一次插入大量的行,所以我们需要使用批量插入(强制

我尝试使用
insert或replace
,但它似乎在改变
id
,即使行没有改变

sqlite> insert or replace into settings (name, val) values("name1", 1), ("name2", 20);
sqlite> select * from settings;
1|name1|1
2|name2|20
sqlite> insert or replace into settings (name, val) values("name1", 1), ("name2", 20);
sqlite> select * from settings;
3|name1|1
4|name2|20
然后我尝试在冲突中使用

sqlite> insert into settings (name, val) values("name1", 88), ("name2", 6) on conflict do update set val=5, id=rowid+1;
sqlite> select * from settings;
1|name1|88
2|name2|6
sqlite> insert into settings (name, val) values("name1", 88), ("name2", 6) on conflict do update set val=5, id=rowid+1;
Error: UNIQUE constraint failed: settings.id

如何实现这一点的任何建议?

创建一个
CTE
将显示所有要插入的行。
而不是
插入或替换到。。。值
使用
插入或替换到。。。选择…
,使用一个
EXCEPT
子句,该子句将排除表中已经存在的行,并尝试仅插入具有不同
名称的行和/或
val

WITH cte(name, val) AS (VALUES ('name1', 1), ('name2', 20))
INSERT OR REPLACE INTO settings (name, val) 
SELECT name, val FROM cte
EXCEPT
SELECT name, val FROM settings

请参阅。

为什么会有人对此持否定态度而不作任何评论?