我正在尝试将数据插入表中。如果该列没有数据,我希望插入该行,而不考虑其他列。
CREATE TABLE t (
id INTEGER PRIMARY KEY,
name VARCHAR,
other INT
);
INSERT OR IGNORE INTO t (name) VALUES ('a');
INSERT OR IGNORE INTO t (name) VALUES ('a');
INSERT OR IGNORE INTO t (name) VALUES ('a');
在上面的片段中,我得到了3行,而不是我想象中的1行。如果实际的sql发生在INSTEAD OF INSERT
触发器内部很重要,那么这只是一个简单的测试用例。
更换
CREATE TABLE t (
id INTEGER PRIMARY KEY,
name VARCHAR,
other INT
);
带有
CREATE TABLE t (
id INTEGER PRIMARY KEY,
name VARCHAR UNIQUE,
other INT
);
然后你会得到
sqlite> CREATE TABLE t (
...> id INTEGER PRIMARY KEY,
...> name VARCHAR UNIQUE,
...> other INT
...> );
sqlite> INSERT OR IGNORE INTO t (name) VALUES ('a');
sqlite> INSERT OR IGNORE INTO t (name) VALUES ('a');
sqlite> INSERT OR IGNORE INTO t (name) VALUES ('a');
sqlite> select * from t ;
1|a|
这只适用于主键字段或唯一约束:
可选冲突子句允许指定在这是一个INSERT命令。
进一步:
ON CONFLICT子句适用于UNIQUE和NOT NULL约束(以及本节中的PRIMARY KEY约束与UNIQUE约束相同)。ON CONFLICT算法不适用于FOREIGN KEY约束。有五个冲突分辨率算法选择:ROLLBACK、ABORT、FAIL、IGNORE和更换。默认的冲突解决算法是ABORT。