我正在尝试将数据插入表格中。如果列中没有数据,我想插入行 - 无论其他列如何。
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
触发器内,这只是一个简单的测试用例。
答案 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。