sqlite - 如何让INSERT或IGNORE工作

时间:2012-08-24 07:47:39

标签: sqlite

我正在尝试将数据插入表格中。如果列中没有数据,我想插入行 - 无论其他列如何。

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行,而不是我想象的那样。如果重要的是实际的sql发生在INSTEAD OF INSERT触发器内,这只是一个简单的测试用例。

2 个答案:

答案 0 :(得分:84)

替换

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|

答案 1 :(得分:15)

这只适用于主键字段或唯一约束:

  

可选的conflict-clause允许指定   替代约束冲突解决算法使用期间   这一个INSERT命令。

此外:

  

ON CONFLICT子句适用于UNIQUE和NOT NULL约束   (以及出于本节目的的主要约束条件   与UNIQUE约束相同)。 ON CONFLICT算法   不适用于FOREIGN KEY约束。有五个冲突   分辨率算法选择:ROLLBACK,ABORT,FAIL,IGNORE和   更换。默认的冲突解决算法是ABORT。