#sqlite #sql-insert #upsert
Вопрос:
Я пытаюсь игнорировать вставки, если комбинация тегов и 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
Ответ №1:
Вы неправильно используете синтаксис UPSERT в SQLite.
Во-первых, у вас есть ;
право после 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 (?, ?);
Смотрите демонстрацию.