Maison  >  Article  >  base de données  >  Comment échanger les valeurs de priorité des lignes dans MySQL avec une contrainte unique ?

Comment échanger les valeurs de priorité des lignes dans MySQL avec une contrainte unique ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 16:40:02769parcourir

How to Swap Row Priority Values in MySQL with a Unique Constraint?

Échanger les valeurs des lignes avec des contraintes uniques dans MySQL

Question :

Comment pouvez-vous échanger les valeurs de priorité de deux lignes dans MySQL sans violer la contrainte unique de la table sur la colonne de priorité ?

Contexte :

La table des tâches a une colonne de priorité avec un unique contrainte, ce qui signifie que chaque ligne peut avoir une valeur unique dans cette colonne. Lors de la mise à jour des lignes, MySQL vérifie les violations de contraintes uniques après chaque mise à jour, ce qui empêche l'échange direct des valeurs.

Solution :

Malheureusement, il n'est pas possible d'échanger les valeurs de lignes directement dans MySQL sans violer la contrainte unique ni utiliser de fausses valeurs et plusieurs requêtes. Cela est dû à la manière inhabituelle de MySQL de traiter les mises à jour, qui applique des contrôles d'unicité après chaque mise à jour de ligne plutôt qu'après la fin de l'instruction de mise à jour.

Bien qu'il soit possible de résoudre des problèmes similaires avec d'autres SGBD en utilisant des astuces comme ORDER BY , cette technique ne fonctionne pas pour échanger des valeurs.

Alternatives :

Deux approches alternatives peuvent être envisagées :

  1. NULL ou Valeurs fausses : utilisez une valeur NULL ou une valeur fausse qui n'existe pas dans la colonne. Cela nécessite l'utilisation de plusieurs requêtes pour terminer l'échange.
  2. Suppression de contrainte temporaire : supprimez temporairement la contrainte unique, effectuez l'échange et rajoutez la contrainte. Il ne s'agit pas d'une approche recommandée car elle peut entraîner des problèmes d'intégrité des données.

Exemple (entier signé et aucune valeur négative) :

Si la colonne de priorité est un entier signé qui ne contient pas de valeurs négatives, vous pouvez utiliser la requête suivante enveloppée dans une transaction :

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

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