如何让 ON CONFLICT IGNORE 在 sqlite 中工作

How to get ON CONFLICT IGNORE working in sqlite

如果标签和 url 组合已经存在,我试图忽略插入:

INSERT INTO tags(tag, url) VALUES (?, ?); 
              ON CONFLICT(url, tag) IGNORE 

我在 (tag, url)

上有一个唯一索引
    CREATE UNIQUE INDEX tag_url ON tags (tag, url)

应用程序崩溃说 [uncaught application error]: SqliteError - UNIQUE constraint failed: tags.tag, tags.url

您使用的 SQLite UPSERT 语法不正确。

首先,在 INSERT 语句之后和 ON CONFLICT 之前有一个 ;,它将语句分隔为不同的语句。
这意味着 INSERT 语句作为简单语句执行(ON CONFLICT 子句没有任何区别),因此您会得到 UNIQUE constraint failed 错误。

此外,您使用的关键字 IGNORE 而不是 DO NOTHING

将您的代码更改为:

INSERT INTO tags(tag, url) VALUES (?, ?)
ON CONFLICT(tag, url) DO NOTHING;

您可以使用 INSERT OR IGNORE 语法实现相同的效果:

INSERT OR IGNORE INTO tags(tag, url) VALUES (?, ?); 

参见demo