Sqlite 插入或更新条目,但因唯一约束冲突而失败

Sqlite 插入或更新条目,但因唯一约束冲突而失败,sqlite,Sqlite,想象一张这样的桌子: +-----+-------+ | id | value | +-----+-------+ | id1 | val1 | | id2 | val2 | +-----+-------+ 而id是主键,value有唯一的约束 我想做的是使用一个查询,根据其主键插入或更新条目,但如果违反了唯一约束,则会失败 例如,如果我尝试插入id1,val2,我希望查询失败,而插入id1,val3应该更新第一行 然而,我在sqlite3中观察到,如果我使用INSERT或REPLAC

想象一张这样的桌子:

+-----+-------+
| id  | value |
+-----+-------+ 
| id1 | val1  |
| id2 | val2  |
+-----+-------+
而id是主键,value有唯一的约束

我想做的是使用一个查询,根据其主键插入或更新条目,但如果违反了唯一约束,则会失败

例如,如果我尝试插入id1,val2,我希望查询失败,而插入id1,val3应该更新第一行

然而,我在sqlite3中观察到,如果我使用INSERT或REPLACE插入id1,val2,它将替换两个现有条目。我还查看了sqlite的ON CONFLICT子句,但是似乎没有一种方法来区分唯一或主键约束冲突


是否有任何方法可以使用sqlite执行类似操作,或者是否有其他方法可以处理类似情况?

Jan,希望这能帮助您:

该子句使用任何唯一约束(包括主键约束)来检测冲突

如果内置行为不是你想要的,你必须自己做:

c、 ExecuteUpdateMyTable集合值=?其中id=?;,[newValue,id] 如果c.rowcount==0: c、 executeINSERT进入MyTableval,id值?;,[newValue,id]
您可以通过如下方式创建表来实现这一点:

CREATE TABLE test (
   id INTEGER, 
   value VARCHAR(32) UNIQUE ON CONFLICT FAIL, 
   PRIMARY KEY(Id) ON CONFLICT REPLACE
);
关键是为不同的列定义不同的ON冲突子句。冲突替换时的主键ID将导致sqlite在插入具有冲突PK的新记录时替换记录,而值VARCHAR32 UNIQUE ON CONFLICT FAIL将导致sqlite在插入违反唯一约束的值时失败

这将在插入具有相同主键的新记录时更新现有值,但如果尝试插入具有不同主键和相同值的两个记录,则会失败

例如

INSERT INTO test VALUES (1, "test");
INSERT INTO test VALUES (1, "update");
将导致

SELECT * FROM test;
1|update
但是用新的PK插入相同的值

INSERT INTO test VALUES (2, "update");

将导致错误:唯一约束失败:test.value。

内置行为似乎是可能的。诀窍是使用相应的冲突解决方法创建表,如冲突失败时的值VARCHAR32 UNIQUE,冲突替换时的主键id,然后只使用INSERT命令。