233 votes

Instruction "Insérer si elle n'existe pas" dans SQLite

J'ai une base de données SQLite. J'essaie d'insérer des valeurs ( users_id , lessoninfo_id ) dans le tableau bookmarks seulement si les deux n'existent pas auparavant 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+")))

Une erreur se produit alors :

erreur db près de la syntaxe where.

604voto

CL. Points 46451

Si vous ne voulez jamais avoir de doublons, vous devez le déclarer 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 base de données que vous souhaitez ignorer silencieusement les enregistrements qui violeraient une telle contrainte :

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

220voto

Krister Andersson Points 9788

Si vous disposez d'un tableau appelé "mémos" qui comporte deux colonnes id et text vous devriez pouvoir procéder de la sorte :

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ù text est égal à "texte à insérer" et 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 tableau de manière à ce qu'aucun doublon ne soit autorisé, comme l'explique la rubrique @CLs answer ci-dessous.

55voto

Ali Bagheri Points 632

Pour une colonne unique, utilisez ceci :

INSERT OR REPLACE INTO tableName (...) values(...);

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

6voto

suat dmk Points 96
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;

C'est le moyen le plus rapide.

Pour d'autres moteurs SQL, vous pouvez utiliser une table fictive contenant 1 enregistrement. Par exemple

select 1, 167 from ONE_RECORD_DUMMY_TABLE

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X