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

Comment échanger les valeurs de ligne dans MySQL avec une contrainte unique ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-26 04:23:31250parcourir

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

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 :

  1. Mettre à jour les lignes avec de fausses valeurs : Définissez la priorité d'une ligne sur une valeur négative inexistante (-2) et l'autre ligne sur une autre valeur négative (-3).
  2. Échangez les valeurs en utilisant des valeurs négatives : Annulez les fausses valeurs (-priority) pour échanger les priorités.
  3. Commettez le transaction : Pour appliquer les modifications de manière permanente.

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!

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