想象一个这样的表:
+-----+-------+
| id | value |
+-----+-------+
| id1 | val1 |
| id2 | val2 |
+-----+-------+
而id
isPRIMARY KEY
和value
具有UNIQUE
约束。
我想做的是使用一个查询,该查询基于其主键插入或更新条目,但是如果违反了唯一约束,则查询失败。
例如,如果我尝试插入id1, val2
,我希望查询失败,而插入id1, val3
应更新第一行。
但是我在sqlite3中观察到的是,如果我使用它INSERT OR REPLACE
插入id1, val2
,它将替换两个现有条目。我也看过ON CONFLICT
sqlite的子句,但是似乎没有办法区分UNIQUE
或PRIMARY KEY
约束违规。
有什么办法可以用sqlite做这样的事情,或者是否有另一种方法可以解决这样的情况?
您可以通过如下创建表来实现此目的:
CREATE TABLE test (
id INTEGER,
value VARCHAR(32) UNIQUE ON CONFLICT FAIL,
PRIMARY KEY(Id) ON CONFLICT REPLACE
);
关键是ON CONFLICT
为不同的列定义不同的子句。PRIMARY KEY(Id) ON CONFLICT REPLACE
在插入具有冲突PK的新记录时,将导致sqlite替换记录,而value VARCHAR(32) UNIQUE ON CONFLICT FAIL
在插入value
违反UNIQUE
约束的条件时,导致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");
将导致Error: UNIQUE constraint failed: test.value
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句