SQL Server Insert OR Update

Comment écrire une requête SQL Server Insert OR Update? Voici 2 solutions différentes, rapides et faciles pour écrire une requête « UPDATE OR INSERT ». En d’autres termes, éviter l’erreur SQL Server « Cannot insert duplicate key in object », « The duplicate key value is » car la ligne en question existe déjà dans la table cible. En effet, une insertion d’une même clef provoque une erreur.

 

Avant de commencer, pour tester les 2 solutions d’une manière pratique, exécuter ce script pour créer une table d’exemple et insérer deux lignes de données.

 

SQL Server Insert OR Update

Dans cet exemple, ce code de création de la table VENTES est utilisé pour l’exemple INSERT or UPDATE.

-- Si la table existe déjà, alors on la supprime
IF exists (
  SELECT 1 FROM sys.objects
  WHERE  object_id = object_id(N'[dbo].[VENTES]') AND type in (N'U')
)
BEGIN  DROP TABLE [dbo].[VENTES]
END
GO

-- Creation de la table d'exemple avec la colonne MOIS déclarée comme UNIQUE
CREATE TABLE [dbo].[VENTES]
(
  [MOIS]		nvarchar(20) UNIQUE,
  [MONTANT]	numeric(5)
)
GO

-- Insertion des données pour l'exemple
INSERT INTO dbo.VENTES ( MOIS, MONTANT ) VALUES  ( N'Janvier', 1000);
INSERT INTO dbo.VENTES ( MOIS, MONTANT ) VALUES  ( N'Janvier', 2000);

Le message d’erreur qui s’affiche ressemble à cela, avec une version SQL Server en Anglais.

Msg 2627, Level 14, State 1, Line 3
Violation of UNIQUE KEY constraint ‘UQ__VENTES__*’. Cannot insert duplicate key in object ‘dbo.VENTES’. The duplicate key value is (Janvier).
The statement has been terminated.

 

Deux approches Insert OR Update ou alors Update OR Insert avec SQL Server

La première solution pour faire un INSERT OR UPDATE avec Microsoft SQL Server se fait en deux étapes.

Premièrement, on test si la ligne à insérer existe dans la table, à l’aide de la fonction EXISTS. Ensuite en fonction du résultat, si la ligne existe alors on effectue un UPDATE pour mettre à jour la valeur, et si elle n’existe pas alors on lance un INSERT pour insérer une nouvelle ligne. En pratique on ne fait pas un INSERT OR UPDATE, mais plutôt un UPDATE OR INSERT.

IF EXISTS(SELECT * FROM dbo.VENTES WHERE MOIS = 'Janvier')
BEGIN
  UPDATE 	dbo.VENTES
  SET 	MONTANT = 2000
  WHERE 	MOIS = 'Janvier';
END
ELSE
BEGIN
  INSERT INTO dbo.VENTES ( MOIS, MONTANT ) 
  VALUES  ( N'Janvier', 2000);
END

Voici la deuxième solution, effectuer un UPDATE et vérifier les lignes mises à jour.

Deuxièmement, commencer par un UPDATE de la ligne. Ensuite, seulement si le nombre de lignes mises à jour est égal à 0 alors on exécute l’instruction INSERT.  Pour finir, Cette dernière insère une nouvelle ligne pour le mois de Janvier, qui est la clef.

UPDATE 	dbo.VENTES
SET 	MONTANT = 2000
WHERE 	MOIS = 'Janvier';

IF @@ROWCOUNT = 0
BEGIN
  INSERT INTO dbo.VENTES ( MOIS, MONTANT ) 
  VALUES  ( N'Janvier', 2000);
END;

 

Enfin, cet article vous a présenté ici deux façons de vérifié l’existence de données avant insertion ou après une mise à jour. Pour aller plus loin, la mise à jour d’une autre ligne avec la valeur de la même colonne peut vous intéresser.

Soyez le premier à commenter

Laisser un commentaire