J'ai une base de données qui est mise à jour avec des jeux de données de temps en temps. Ici, il peut arriver qu'un jeu de données existe déjà dans la base de données.
Actuellement je fais d'abord une
SELECT FROM ... WHERE val1=... AND val2=...
vérifier si un jeu de données avec ces données existe déjà (en utilisant les données de l'instruction WHERE). Si cela ne renvoie aucune valeur, je fais mon INSERT.
Mais cela semble être un peu compliqué pour moi. Ma question est donc la suivante: existe-t-il une sorte d’INSERT conditionnel qui ajoute un nouvel ensemble de données au cas où il n’existerait pas?
J'utilise SmallSQL
Vous pouvez le faire avec une seule instruction et une sous-requête dans presque toutes les bases de données relationnelles.
INSERT INTO targetTable(field1)
SELECT field1
FROM myTable
WHERE NOT(field1 IN (SELECT field1 FROM targetTable))
Certaines bases de données relationnelles ont une syntaxe améliorée pour ce qui précède, car ce que vous décrivez est une tâche assez courante. SQL Server a une syntaxe MERGE
avec toutes sortes d'options, et MySQL a la syntaxe optionnelle INSERT OR IGNORE
.
Edit:La documentation de SmallSQL est assez rare en ce qui concerne les parties du standard SQL implémentées. Il est possible que les sous-requêtes ne soient pas implémentées. Par conséquent, vous ne pourrez peut-être pas suivre les conseils ci-dessus, ni ailleurs, si vous devez conserver SmallSQL.
Je ne sais pas à propos de SmallSQL, mais cela fonctionne pour MSSQL:
IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')
UPDATE Table1 SET (...) WHERE Column1='SomeValue'
ELSE
INSERT INTO Table1 VALUES (...)
En fonction de la condition where, la ligne est mise à jour si elle existe, sinon elle en insère une nouvelle.
J'espère que c'est ce que vous cherchiez.
C'est possible avecEXISTS
condition. WHERE EXISTS
vérifie l'existence de tous les enregistrements d'une sous-requête. EXISTS
renvoie true si la sous-requête renvoie un ou plusieurs enregistrements ..__ Voici un exemple
UPDATE TABLE_NAME
SET val1=arg1 , val2=arg2
WHERE NOT EXISTS
(SELECT FROM TABLE_NAME WHERE val1=arg1 AND val2=arg2)
Généralement, vous créez la chose que vous ne voulez pas dupliquer unique et laissez la base de données elle-même refuser l’insertion.
Sinon, vous pouvez utiliser INSERT INTO, voir Comment éviter les doublons dans la requête INSERT INTO SELECT dans SQL Server?
Si vous cherchez à effectuer une "upsert", l’une des méthodes les plus efficaces actuellement dans SQL Server pour les lignes simples est la suivante:
UPDATE myTable ...
IF @@ROWCOUNT=0
INSERT INTO myTable ....
Vous pouvez également utiliser la syntaxe MERGE
si vous utilisez des ensembles de données plutôt que des lignes simples.
Si vous voulez INSERT
et non UPDATE
, vous pouvez simplement écrire votre unique instruction INSERT
et utiliser WHERE NOT EXISTS (SELECT ...)