如何让 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。
如果标签和 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。