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