web-dev-qa-db-fra.com

Est-ce que INSERT conditionnel avec SQL?

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

17
Elmi

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. 

24
DougM

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.

12
Fabian Bigler

C'est possible avecEXISTScondition. 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)
1
TMtech

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?

0
ZhiHeather

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 ...)

0
Matthew