Maison >base de données >tutoriel mysql >Comment échanger des valeurs dans MySQL sans violations de contraintes uniques ?

Comment échanger des valeurs dans MySQL sans violations de contraintes uniques ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-26 05:07:31335parcourir

How to Swap Values in MySQL without Unique Constraint Violations?

Échanger des valeurs dans MySQL sans violations de contrainte unique

Dans MySQL, échanger des valeurs entre deux lignes peut être difficile lorsqu'une contrainte unique est appliquée à la colonne concernée. Le problème se pose car MySQL applique des vérifications de contraintes après chaque mise à jour de ligne, plutôt que la fin de l'instruction entière.

Pour résoudre cette limitation, envisagez la solution suivante :

<code class="sql">START TRANSACTION ;
    UPDATE tasks 
    SET priority = 
      CASE
        WHEN priority = 2 THEN -3 
        WHEN priority = 3 THEN -2 
      END 
    WHERE priority IN (2,3) ;

    UPDATE tasks 
    SET priority = - priority
    WHERE priority IN (-2,-3) ;
COMMIT ;</code>

Dans cette solution , une transaction est initiée pour garantir que les deux mises à jour sont effectuées de manière atomique. Des valeurs négatives sont temporairement affectées aux priorités pour éviter les conflits avec la contrainte unique. Par la suite, une autre mise à jour attribue les valeurs négatives aux priorités d'origine, échangeant ainsi efficacement leurs valeurs.

Alternativement, si les valeurs négatives ne sont pas autorisées dans la colonne des priorités, vous pouvez utiliser des variables temporaires ou créer une table temporaire pour contenir les valeurs négatives. valeurs échangées. Cependant, ces méthodes peuvent impliquer plusieurs requêtes.

Il est important de noter qu'il n'est pas recommandé de supprimer temporairement la contrainte unique, car cela peut compromettre l'intégrité des données.

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