Échanger des valeurs de colonne indexées uniques dans la base de données

J'ai une table de base de données et l'un des champs (pas la clé primaire) contient un index unique. Maintenant, je veux échanger des valeurs sous cette colonne pour deux lignes. Comment cela pourrait-il être fait? Deux hacks que je connais sont :

  1. Supprimez les deux lignes et réinsérez-les
  2. Mettre à jour les lignes avec une autre valeur et échanger puis mettre à jour à la valeur réelle.

Mais je ne veux pas opter pour ceux-ci car ils ne semblent pas être la solution appropriée au problème. Quelqu'un pourrait-il m'aider ?

请先 登录 后评论

4 réponses

Yaakov Ellis

Je pense aussi que

请先 登录 后评论
Andy Irving

En supposant que vous connaissiez le PK des deux lignes que vous souhaitez mettre à jour... Cela fonctionne dans SQL Server, ne peut pas parler pour d'autres produits. SQL est (supposé être) atomique au niveau de l'instruction :

CREATE TABLE testing
(
    cola int NOT NULL,
    colb CHAR(1) NOT NULL
);

CREATE UNIQUE INDEX UIX_testing_a ON testing(colb);

INSERT INTO testing VALUES (1, 'b');
INSERT INTO testing VALUES (2, 'a');

SELECT * FROM testing;

UPDATE testing
SET colb = CASE cola WHEN 1 THEN 'a'
                WHEN 2 THEN 'b'
                END
WHERE cola IN (1,2);

SELECT * FROM testing;

vous passerez donc de :

cola    colb
------------
1       b
2       a

à :

cola    colb
------------
1       a
2       b
请先 登录 后评论
Community

Suite à la réponse d'Andy Irving

cela a fonctionné pour moi (sur SQL Server 2005) dans une situation similaire où j'ai une clé composite et j'ai besoin d'échanger un champ qui fait partie de la contrainte unique.

clé : pID, LNUM rec1 : 10, 0 rec2 : 10, 1 rec3 : 10, 2

et j'ai besoin d'échanger LNUM pour que le résultat soit

clé : pID, LNUM rec1 : 10, 1 rec2 : 10, 2 rec3 : 10, 0

le SQL nécessaire :

UPDATE    DOCDATA    
SET       LNUM = CASE LNUM
              WHEN 0 THEN 1
              WHEN 1 THEN 2 
              WHEN 2 THEN 0 
          END
WHERE     (pID = 10) 
  AND     (LNUM IN (0, 1, 2))
请先 登录 后评论
BlueRaja - Danny Pflughoeft

Oracle a différé la vérification de l'intégrité, ce qui résout exactement ce problème, mais il n'est disponible ni dans SQL Server ni dans MySQL.

请先 登录 后评论