【发布时间】:2020-06-02 20:09:52
【问题描述】:
我有一个 SQLite 数据库,其中包括下表。
CREATE TABLE IF NOT EXISTS biases
(
data INTEGER NOT NULL,
link INTEGER DEFAULT 0,
bias_type INTEGER,
ignores INTEGER DEFAULT 0,
desists INTEGER DEFAULT 0,
encashes INTEGER DEFAULT 0,
accesses INTEGER DEFAULT 0,
scraps INTEGER DEFAULT 0,
CONSTRAINT pk_bias_mix PRIMARY KEY(data,link,bias_type)
);
约束pk_bias_mix 用于确保没有两行可以对data、link 和bias_type 列的所有三列具有相同的值。所以假设我这样做了
INSERT INTO biases (data,link,bias_type,ignores) VALUES(1,1,1,1);
一切正常 - 在表中插入了一个新行。如果我再次发出相同的 INSERT,我会收到错误
唯一约束失败:biases.data,biases.link,biases.bias_type
正如预期的那样。因此,我尝试使用 SQLite ON CONFLICT 子句
INSERT INTO biases (data,link,bias_type,ignores) VALUES(1,1,1,1)
ON CONFLICT(data,link,bias_type) DO UPDATE SET ignores = ignores + 1;
它按我希望的那样工作 - SQLite 没有添加新行或抛出错误,而是使用匹配的 data、link 和 bias_type 值增加了行中 ignores 列的值.
不过,这只是实验的结果。从 SQLite 文档中我并不清楚这确实是 ON CONFLICT 应该如何表现 - 即可以给它两个或多个冲突约束进行检查。我所说的两个或更多约束的意思是在CONFLICT(...) 中指定多个逗号分隔的列,就像我在上面的示例中所做的那样。
我怀疑这是正确的用法,因为我只是指定了一个CONFLICT 条件来复制我指定的CONSTRAINT。但是,我在文档中的任何地方都看不到这一点。对于任何能够证实这一点的人,我将不胜感激。
【问题讨论】: