MySQL échangeant les valeurs de ligne avec une contrainte unique
Dans MySQL, l'échange des valeurs de priorité de deux lignes avec une contrainte unique sur la colonne de priorité peut être un défi.
Problème :
Lors de l'utilisation de cette instruction pour échanger des valeurs :
UPDATE tasks SET priority = CASE WHEN priority=2 THEN 3 WHEN priority=3 THEN 2 END WHERE priority IN (2,3);
une erreur se produit en raison d'une violation d'entrée en double de la contrainte unique.
Solution :
Malheureusement, échanger des valeurs sans utiliser plusieurs requêtes ou de fausses valeurs n'est pas possible dans MySQL. En effet, MySQL applique la vérification des contraintes après chaque mise à jour de ligne, contrairement à certains autres SGBD.
Approche alternative :
Pour échanger des valeurs sans violer la contrainte, vous pouvez utiliser le étapes suivantes au sein d'une transaction :
Relevé de transaction :
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 ;
Remarque :
Cette approche nécessite que la colonne unique soit un entier signé sans valeurs négatives. Si des valeurs négatives sont autorisées, une solution différente peut être nécessaire.
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!