如何使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触发器内部很重要,那么这只是一个简单的测试用例。

更换

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。

最新更新