web-dev-qa-db-fra.com

Comment puis-je faire un insert où n'existe pas?

J'aimerais combiner une requête d'insertion avec un "où pas n'existe pas" afin de ne pas violer les contraintes PK. Cependant, une syntaxe telle que celle-ci me donne une erreur Incorrect syntax near the keyword 'WHERE' -

INSERT INTO myTable(columns...)
VALUES(values...)
WHERE NOT EXISTS
   (SELECT *
    FROM myTable
    WHERE pk_part1 = value1,
        AND pk_part2 = value2)

Comment puis-je accomplir cela?

(En général, pouvez-vous combiner une insertion avec une clause where?)

16
froadie
INSERT INTO myTable(columns...)
Select values...
WHERE NOT EXISTS
   (SELECT *
    FROM myTable
    WHERE pk_part1 = value1,
        AND pk_part2 = value2)

Edit: Après avoir lu le lien martins, Si vous admettez que la meilleure solution est:

BEGIN TRY
    INSERT INTO myTable(columns...)
    values( values...)
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH;
20
bernd_k

Le moyen le plus simple de conserver une liste de valeurs unique consiste à: a) définir les colonnes comme clé primaire ou b) créer une contrainte unique sur les colonnes. Dans l'un ou l'autre cas, une erreur se produirait lors de la tentative d'insertion/de mise à jour de valeurs déjà existantes dans la table. Lorsqu'un NOT EXISTS/etc échouerait en silence - aucune erreur, la requête s'exécutera correctement.

Cela dit, utilisez un INSERT/SELECT (n'incluez pas la partie VALUES):

INSERT INTO myTable(columns...)
SELECT [statically defined values...]
  FROM ANY_TABLE
 WHERE NOT EXISTS (SELECT NULL
                     FROM myTable
                    WHERE pk_part1 = value1
                      AND pk_part2 = value2)
3
OMG Ponies

Aucun des exemples n'a fonctionné pour moi ... donc je suggère cet exemple:

INSERT INTO database_name.table_name(column_name)
SELECT column_name
  FROM database_name.table_name
 WHERE NOT EXISTS (SELECT NULL
                     FROM database_name.table_name
                    WHERE column_name = 'Column Value')
0
Tom Stock