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