“Insérer si n'existe pas” énoncé dans SQLite
J'ai une base de données SQLite. Je suis en train d'insérer des valeurs (users_id
, lessoninfo_id
) dans le tableau bookmarks
, seulement si les deux n'existent pas avant dans une rangée.
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 un message d'erreur indiquant:
db erreur près de l'endroit où la syntaxe.
Vous devez vous connecter pour publier un commentaire.
Si vous avez une table appelée mémos qui a deux colonnes
id
ettext
vous devriez être en mesure de le faire comme ceci:Si un enregistrement contient déjà une ligne où
text
est égal à 'texte à insérer" etid
est égal à 5, alors l'opération d'insertion seront ignorés.Je ne sais pas si cela fonctionne pour votre requête particulière, mais peut-être vous donner un indice sur la façon de procéder.
Je voudrais des conseils que vous avez au lieu de la conception de votre tableau, de sorte que pas de doublons sont autorisés comme expliqué dans
@CLs réponse
ci-dessous.Si vous ne voulez pas avoir des doublons, vous devez déclarer cela comme une contrainte de table:
(Une clé primaire sur les deux colonnes ont le même effet.)
Il est alors possible de dire à la base de données que vous souhaitez silencieusement ignorer les enregistrements qui serait en violation de cette contrainte:
person (id, name unique)
etcat (person_id, name unique)
et je veux insérer beaucoup de paires(person_name, cat_name)
?ON CONFLICT IGNORE
àCREATE TABLE
serait un peu plus pratiqueUNIQUE
lors de la création d'une table, mais j'ai la première colonneid
comme une clé primaire? J'ai vérifié, il ne met pas à jour les valeurs si j'essaie d'insérer quoi que ce soit avec le mêmeid
avecINSERT OR IGNORE
. Donc, dois-je besoin d'unUNIQUE
contraindre si j'ai une CLÉ PRIMAIRE ou est il y a quelque chose qui me manque?Pour une colonne unique, utilisez ceci:
Pour plus d'informations, voir: sqlite.org/lang_insert
C'est le moyen le plus rapide.
Pour certains autres moteurs SQL, vous pouvez utiliser une table Factice contenant 1 enregistrement.
e.g: