Инструкция "Insert if not exists" в SQLite
у меня есть база данных SQLite. Я пытаюсь вставить значения (users_id
,lessoninfo_id
) в таблице bookmarks
, только если оба не существуют ранее подряд.
INSERT INTO bookmarks(users_id,lessoninfo_id)
VALUES(
(SELECT _id FROM Users WHERE User='"+$('#user_lesson').html()+"'),
(SELECT _id FROM lessoninfo
WHERE Lesson="+lesson_no+" AND cast(starttime AS int)="+Math.floor(result_set.rows.item(markerCount-1).starttime)+")
WHERE NOT EXISTS (
SELECT users_id,lessoninfo_id from bookmarks
WHERE users_id=(SELECT _id FROM Users
WHERE User='"+$('#user_lesson').html()+"') AND lessoninfo_id=(
SELECT _id FROM lessoninfo
WHERE Lesson="+lesson_no+")))
это дает ошибку говоря:
ошибка БД рядом с синтаксисом.
5 ответов:
если у вас есть таблица под названием memos, которая имеет два столбца
id
иtext
вы должны быть в состоянии сделать такой:INSERT INTO memos(id,text) SELECT 5, 'text to insert' WHERE NOT EXISTS(SELECT 1 FROM memos WHERE id = 5 AND text = 'text to insert');
если запись уже содержит строку
text
равно "текст для вставки" иid
равно 5, тогда операция вставки будет проигнорирована.Я не знаю, будет ли это работать для вашего конкретного запроса, но, возможно, это даст вам подсказку о том, как действовать.
Я бы посоветовал вам вместо этого создать свой стол так, чтобы никакие дубликаты не допускаются, как описано в
@CLs answer
ниже.
Если вы не хотите иметь дубликаты, вы должны объявить это как ограничение таблицы:
CREATE TABLE bookmarks( users_id INTEGER, lessoninfo_id INTEGER, UNIQUE(users_id, lessoninfo_id) );
(первичный ключ над обоими столбцами будет иметь тот же эффект.)
тогда можно сказать базе данных, что вы хотите молча игнорировать записи, которые нарушают такое ограничение:
INSERT OR IGNORE INTO bookmarks(users_id, lessoninfo_id) VALUES(123, 456)
для уникального столбца, используйте этот:
INSERT OR REPLACE INTO table () values();
для получения дополнительной информации см.: sqlite.org/lang_insert
insert into bookmarks (users_id, lessoninfo_id) select 1, 167 EXCEPT select user_id, lessoninfo_id from bookmarks where user_id=1 and lessoninfo_id=167;
Это самый быстрый способ.
для некоторых других механизмов SQL можно использовать фиктивную таблицу, содержащую 1 запись. например:
select 1, 167 from ONE_RECORD_DUMMY_TABLE