【问题标题】:sqlite - How to get INSERT OR IGNORE to worksqlite - 如何让 INSERT 或 IGNORE 工作
【发布时间】:2012-08-19 18:28:38
【问题描述】:

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

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');

使用上面的 sn-p,我最终得到 3 行,而不是我想象的 1 行。如果实际的 sql 发生在 INSTEAD OF INSERT 触发器内很重要,这只是一个简单的测试用例。

【问题讨论】:

  • 请注意thatINSERT OR IGNORE 完全等同于:INSERT ON CONFLICT IGNORE

标签: sqlite


【解决方案1】:

替换

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|

【讨论】:

    【解决方案2】:

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

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

    进一步:

    ON CONFLICT 子句适用于 UNIQUE 和 NOT NULL 约束 (以及就本节而言的 PRIMARY KEY 约束 与 UNIQUE 约束相同)。 ON CONFLICT 算法 不适用于 FOREIGN KEY 约束。有五种冲突 分辨率算法选择:ROLLBACK、ABORT、FAIL、IGNORE 和 代替。默认的冲突解决算法是 ABORT。

    【讨论】:

    • 你能提供代码吗?我的还是不行
    猜你喜欢
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2013-03-22
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多