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
请参阅。为什么会有人对此持否定态度而不作任何评论?