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

Comment effectuer efficacement des upserts dans SQL Server ?

DDD
DDDoriginal
2025-01-22 16:41:11313parcourir

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.

<code class="language-sql">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);</code>

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.

<code class="language-sql">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;</code>

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.

<code class="language-sql">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;</code>

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:
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