Je pense aussi que
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 :
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 ?
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
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))
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.