Instrução “Insert if not exists” no SQLite

Eu tenho um database SQLite. Eu estou tentando inserir valores ( users_id , users_id ) em bookmarks tabela, somente se ambos não existirem antes em uma linha.

 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+"))) 

Isso dá um erro dizendo:

erro de db perto de onde syntax.

Se você tiver uma tabela chamada memos que tenha duas colunas id e text você poderá fazer assim:

 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'); 

Se um registro já contiver uma linha em que o text é igual a ‘text to insert’ e id for igual a 5, a operação de inserção será ignorada.

Não sei se isso funcionará para sua consulta específica, mas talvez isso lhe dê uma dica sobre como proceder.

Eu aconselharia que você @CLs answer sua tabela para que nenhuma duplicata fosse permitida, conforme explicado na @CLs answer abaixo.

Se você nunca quiser ter duplicatas, você deve declarar isso como uma restrição de tabela:

 CREATE TABLE bookmarks( users_id INTEGER, lessoninfo_id INTEGER, UNIQUE(users_id, lessoninfo_id) ); 

(Uma chave primária em ambas as colunas teria o mesmo efeito.)

É então possível informar ao database que você deseja ignorar silenciosamente registros que violariam tal restrição :

 INSERT OR IGNORE INTO bookmarks(users_id, lessoninfo_id) VALUES(123, 456) 

Para uma coluna exclusiva, use isto:

 INSERT OR REPLACE INTO table () values(); 

Para mais informações, consulte: 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; 

Este é o caminho mais rápido.

Para alguns outros mecanismos SQL, você pode usar uma tabela Dummy contendo 1 registro. por exemplo:

 select 1, 167 from ONE_RECORD_DUMMY_TABLE 
 INSERT INTO Database.dbo.Table SELECT * FROM Database.dbo.Table WHERE ID not in (select ID from Database.dbo.Table)