Requête Insert or Update avec SQL Server avec des exemples

Comment écrire une requête SQL Server de type Insert or Update, c’est à d’insertion ou de mise à jour des données ?

Voici deux solutions différentes, rapides et faciles pour écrire une requête de type INSERT OR UPDATE avec SQL Server. En d’autres termes, pour é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, l’insertion de la même clé provoquera une erreur SQL Server.

Avant de commencer, pour tester les deux solutions de manière pratique, exécuter ce script pour créer une table d’exemple et insérer deux lignes de données. La solution est un simple mélange d’une commande de mise à jour et d’une commande d’insertion. Dans cet exemple, le code de création de la table SALES est utilisé pour l’exemple INSERT ou UPDATE. Et donc la mise à jour des lignes de la table cible.

Note : ce SQL insert ou update insère des données dans une table très simple, il suffit d’adapter le code au projet actuel.

1. Deux approches simples : INSERT OR UPDATE ou UPDATE OR INSERT

Après deux insertions consécutives pour le même mois, nous avons obtenu le message d’erreur ci-dessous.

-- Script pour supprimer la table si elle existe déjà 
IF EXISTS (
	SELECT 	1 
	FROM sys.objects
	WHERE 	object_id = object_id(N'[dbo].[SALES]') 
		AND type in (N'U')
)
BEGIN 
	DROP TABLE [dbo].[SALES]
END
GO

-- Créer la table d'exemple avec la colonne mois , MONTH déclarée comme UNIQUE
CREATE TABLE [dbo].[SALES]
(
	[MONTH] 	NVARCHAR(20) UNIQUE,
	[AMOUNT] 	NUMERIC(5)
)
GO

-- Insérer des données sur le mois de Janvier pour l'exemple
INSERT INTO dbo.SALES (MONTH, AMOUNT) VALUES ( N'January', 1000);
INSERT INTO dbo.SALES (MONTH, AMOUNT) VALUES ( N'January', 2000);

Le message d’erreur SQL Server apparaît et ressemble à ceci, avec une version anglaise de SQL Server:

Msg 2627, Level 14, State 1, Line 18
Violation of UNIQUE KEY constraint ‘UQ__SALES__03EA00460E2F3BD5’. Cannot insert duplicate key in object ‘dbo.SALES’. The duplicate key value is (January).
The statement has been terminated.

2. Eviter l’erreur SQL Server Cannot insert duplicate key

Il existe en effet deux façons de faire, soit un INSERT OR UPDATE, soit l’inverse, c’est é dire un UPDATE OR INSERT.

3. Exemple de requête INSERT OR UPDATE en deux étapes

Tout d’abord, on teste si la ligne à insérer existe dans la table, en utilisant la fonction EXISTS. Ensuite, en fonction du résultat, si la ligne existe alors nous effectuons un UPDATE pour mettre à jour la valeur, et si elle n’existe pas alors nous lançons un INSERT pour insérer une nouvelle ligne.

En pratique, c’est effectivement un INSERT OR UPDATE, même si l’insertion de données n’est pas exécutée à chaque fois. C’est à dire dans le cas ou la ligne est déjà présente dans la table SQL Server.

IF NOT EXISTS(SELECT * FROM dbo.SALES WHERE MONTH = 'January')
BEGIN
	INSERT INTO dbo.SALES (MONTH, AMOUNT) 
	VALUES ( N'January', 2000);
END
ELSE
	BEGIN
		UPDATE dbo.SALES
		SET AMOUNT = 2000
		WHERE MONTH = 'January';
	END
GO

4. Effectuer un UPDATE puis vérifier le nombre de lignes mises à jour

Deuxièmement, commencer par une mise à jour de la ligne. Ensuite, seulement si le nombre de lignes mises à jour est égal à zéro alors exécuter l’instruction INSERT. Enfin, cette dernière insère une nouvelle ligne pour le mois de janvier, qui est la clé.

UPDATE dbo.SALES
	SET AMOUNT = 2000
	WHERE MONTH = 'January';
	
IF @@ROWCOUNT = 0
BEGIN
	INSERT INTO dbo.SALES ( MONTH, AMOUNT ) 
	VALUES ( N'January', 2000);
END;

Enfin, cet article présente deux façons de vérifier l’existence de données avant d’insérer ou après une mise à jour d’une table SQL Server.

5. Conclusion sur INSERT or UPDATE en T-SQL

En conclusion, ce tutoriel T-SQL présente deux solutions simples pour écrire une requête SQL Server de type INSERT OR UPDATE, qui permet d’éviter l’erreur « Cannot insert duplicate key in object ». En utilisant des commandes d’insertion et de mise à jour, les solutions permettent de vérifier si une ligne existe déjà dans la table cible avant d’insérer ou de mettre à jour des données.

La première solution utilise une requête INSERT OR UPDATE en deux étapes, qui teste d’abord l’existence de la ligne à insérer avant de mettre à jour ou d’insérer les données.

La seconde solution utilise une requête UPDATE, suivie d’une vérification du nombre de lignes mises à jour et d’une instruction INSERT si nécessaire.

En utilisant ces méthodes, les développeurs SQL peuvent éviter les erreurs de duplication et assurer l’intégrité des données dans leurs tables SQL Server. Pour aller plus loin, consulter cet exemple T-SQL pour insérer des lignes à partir d’une requête select SQL Server.

Requête SQL Server Insert Into depuis un Select

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *