Instrucción “Insertar si no existe” en SQLite

Tengo una base de datos SQLite. Estoy intentando insertar valores ( users_id , lessoninfo_id ) en bookmarks tabla, solo si ninguno de ellos existe antes en una fila.

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

Esto da un error al decir:

db error cerca de donde la syntax.

Si tiene una tabla llamada memos que tiene dos columnas, id y text , debería poder hacer esto:

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

Si un registro ya contiene una fila donde el text es igual a ‘texto para insertar’ e id es igual a 5, entonces la operación de inserción será ignorada.

No sé si esto funcionará para su consulta en particular, pero tal vez le dé una pista sobre cómo proceder.

Le aconsejaría que en su lugar diseñe su tabla para que no se permitan duplicados, como se explica en la @CLs answer continuación.

Si no desea tener duplicados, debe declarar esto como una restricción de tabla:

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

(Una clave principal en ambas columnas tendría el mismo efecto).

Entonces es posible decirle a la base de datos que desea ignorar silenciosamente los registros que violarían tal restricción :

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

Para una columna única, usa esto:

 INSERT OR REPLACE INTO table () values(); 

Para obtener más información, 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; 

Esta es la forma más rápida.

Para algunos otros motores SQL, puede usar una tabla Dummy que contiene 1 registro. p.ej:

 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)