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。