Maison > base de données > tutoriel mysql > Comment effectuer efficacement des upserts dans SQL Server ?

Comment effectuer efficacement des upserts dans SQL Server ?

DDD
Libérer: 2025-01-22 16:41:11
original
379 Les gens l'ont consulté

How to Efficiently Perform Upserts in SQL Server?

Effectuez efficacement des opérations d'insertion ou de mise à jour dans SQL Server

Lorsque vous traitez des opérations CRUD, vous rencontrez souvent des situations dans lesquelles vous devez mettre à jour des enregistrements existants ou insérer de nouveaux enregistrements lorsque la clé primaire n'existe pas. Ceci équivaut à la logique "IF (la clé primaire existe) UPDATE else INSERT".

La question est : comment y parvenir avec des performances optimales ?

Solution SQL Server

SQL Server propose plusieurs solutions :

1. Utilisez l'instruction MERGE

L'instruction

MERGE fournit un moyen concis d'implémenter cette logique. Il permet de spécifier une opération de mise à jour à effectuer si la clé primaire existe, et une opération d'insertion à effectuer si la clé primaire n'existe pas.

MERGE INTO MyTable WITH (HOLDLOCK) AS Target
USING (VALUES (@key, @datafield1, @datafield2)) AS Source(KEY, datafield1, datafield2)
ON (Target.KEY = Source.KEY)
WHEN MATCHED THEN
    UPDATE SET datafield1 = Source.datafield1, datafield2 = Source.datafield2
WHEN NOT MATCHED THEN
    INSERT (KEY, datafield1, datafield2)
    VALUES (Source.KEY, Source.datafield1, Source.datafield2);
Copier après la connexion

2. Utiliser les transactions

Une autre approche consiste à utiliser des transactions pour garantir l'intégrité des données et éviter les conflits de clés primaires.

BEGIN TRANSACTION;
IF EXISTS (SELECT * FROM MyTable WITH (XLOCK) WHERE KEY = @key)
BEGIN
    UPDATE MyTable SET datafield1 = @datafield1, datafield2 = @datafield2
    WHERE KEY = @key;
END
ELSE
BEGIN
    INSERT INTO MyTable (KEY, datafield1, datafield2)
    VALUES (@key, @datafield1, @datafield2);
END
COMMIT TRANSACTION;
Copier après la connexion

3. Utilisez la clause OUTPUT en conjonction avec UPDATE et INSERT

Une troisième option consiste à utiliser une clause OUTPUT pour capturer le nombre de lignes affectées par l'opération UPDATE. Ces informations peuvent ensuite être utilisées pour déterminer si une opération INSERT est requise.

BEGIN TRANSACTION;
UPDATE MyTable SET datafield1 = @datafield1, datafield2 = @datafield2
OUTPUT inserted.KEY INTO @AffectedRows
WHERE KEY = @key;

IF @AffectedRows = 0
BEGIN
    INSERT INTO MyTable (KEY, datafield1, datafield2)
    VALUES (@key, @datafield1, @datafield2);
END
COMMIT TRANSACTION;
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal