sqlite - 如何让INSERT或IGNORE工作

Jus*_*808 56 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');
Run Code Online (Sandbox Code Playgroud)

根据上面的代码片段,我最终会得到3行,而不是我想象的那样.如果重要的是实际的sql发生在INSTEAD OF INSERT触发器内部,这只是一个简单的测试用例.

wil*_*ove 93

更换

CREATE TABLE t (
    id          INTEGER PRIMARY KEY,
    name        VARCHAR,
    other       INT
);
Run Code Online (Sandbox Code Playgroud)

CREATE TABLE t (
    id          INTEGER PRIMARY KEY,
    name        VARCHAR UNIQUE,
    other       INT
);
Run Code Online (Sandbox Code Playgroud)

然后你会得到

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|
Run Code Online (Sandbox Code Playgroud)


ren*_*ene 16

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

可选的conflict-clause允许在此一个INSERT命令期间指定备用约束冲突解决算法.

进一步:

ON冲突条款适用于UNIQUE和NOT NULL约束(以及PRIMARY KEY约束这对于本节的目的是一样的东西UNIQUE约束).ON CONFLICT算法不适用于FOREIGN KEY约束.有五种冲突解决算法选择:ROLLBACK,ABORT,FAIL,IGNORE和REPLACE.默认冲突解决算法是ABORT.