Как перейти К ИГНОРИРОВАНИЮ КОНФЛИКТА, работающему в sqlite

#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 (?, ?); 
 

Смотрите демонстрацию.