Maison >base de données >tutoriel mysql >Comment échanger les valeurs de priorité des lignes dans MySQL avec une contrainte unique ?
É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 :
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!