J'ai une base de données SQLite. J'essaie d'insérer des valeurs (users_id
, lessoninfo_id
) dans la table bookmarks
, uniquement si les deux n'existent pas auparavant dans une ligne.
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 de base de données près de la syntaxe.
Si vous avez une table appelée mémos qui a 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ù 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 conseillerais plutôt de concevoir votre table de manière à éviter les doublons, comme expliqué dans @CLs answer
ci-dessous.
Si vous ne voulez jamais avoir de doublons, vous devez le déclarer comme 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 de dire à la base de données que vous voulez 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
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 certains autres moteurs SQL, vous pouvez utiliser une table factice contenant 1 enregistrement. par exemple:
select 1, 167 from ONE_RECORD_DUMMY_TABLE