Instruction «Insérer si n’existe pas» dans SQLite

J’ai une firebase database SQLite. J’essaie d’insérer des valeurs ( users_id , lessoninfo_id ) dans les bookmarks table, uniquement si les deux n’existent pas auparavant.

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

Cela donne une erreur en disant:

Erreur db à proximité de la syntaxe.

Si vous avez une table appelée mémos avec deux colonnes id et text vous devriez pouvoir faire comme ceci:

 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 enregistrement contient déjà une ligne où le text est égal à “texte à insérer” et où id est égal à 5, l’opération d’insertion sera ignorée.

Je ne sais pas si cela fonctionnera pour votre requête particulière, mais cela vous donnera peut-être un indice sur la façon de procéder.

Je vous conseille plutôt de concevoir votre table de manière à ce qu’aucun doublon ne soit autorisé, comme expliqué dans la @CLs answer ci-dessous.

Si vous ne voulez jamais avoir de doublons, vous devez déclarer cela comme une contrainte de table:

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

(Une clé primaire sur les deux colonnes aurait le même effet.)

Il est alors possible d’indiquer à la firebase database que vous souhaitez ignorer en silence les enregistrements qui violeraient une telle contrainte :

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

Pour une colonne unique, utilisez ceci:

 INSERT OR REPLACE INTO table () values(); 

Pour plus d’informations, voir: sqlite.org/lang_insert