sqlite的 – 如何让INSERT或IGNORE工作
我试图插入数据到表中。 我想插入行,如果列没有数据已经 – 无论其他列。
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
触发器内部,这只是一个简单的testing用例。
更换
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命令中使用另一个约束冲突解决algorithm的规范。
进一步:
ON CONFLICT子句适用于UNIQUE和NOT NULL约束(以及PRIMARY KEY约束,就本节而言,约束与UNIQUE约束相同)。 ON CONFLICTalgorithm不适用于FOREIGN KEY约束。 有五种冲突解决algorithmselect:ROLLBACK,ABORT,FAIL,IGNORE和REPLACE。 默认的冲突解决algorithm是ABORT。