2011-10-05 1 views
0

Je souhaite remplacer les ID d'une table par une autre valeur unique. Ceci est un exemple simplifié:sql: modification de la clé primaire en une autre liste d'éléments uniques

CREATE TABLE IF NOT EXISTS test (
    id int(11) NOT NULL, 
    reverse_id int(11) NOT NULL, 
    PRIMARY KEY (id), 
    UNIQUE KEY reverse_id (reverse_id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

INSERT INTO test (id, reverse_id) VALUES ('1', '2'), ('2', '1'); 

UPDATE test SET id = reverse_id; 

# Duplicate entry '2' for key 'PRIMARY' 

Je suis à la recherche d'une commande qui vérifie uniquement à la fin de la mise à jour du caractère unique des éléments d'identification. [Je sais que je peux créer une deuxième ligne et changer le statut de cette ligne en primaire, puis je peux mettre à jour les identifiants et réinitialiser le statut primaire, mais je veux avoir une commande, sans ajouter ou modifier d'autres lignes , tables]

+0

Vous pouvez supprimer la clé primaire, mais MySQL créera simplement une clé primaire entière cachée, violant ainsi vos exigences. – Johan

Répondre

0

Et si vous créez la table ayant reverse_id comme clé primaire? - C'est unique dans votre définition, donc c'est un candidat valide pour la clé primaire.

Les clés primaires sont uniques par définition - cette contrainte ne vous empêche de réaliser ce que vous voulez

1

Ceci est impossible avec MySQL pour autant que je sache. Elle n'évalue pas la contrainte au niveau de l'instruction (elle le fait au niveau de la ligne pendant le traitement) et ne permet pas non plus de la définir comme différée (donc la contrainte sera évaluée au moment de la validation).

La seule option que je peux voir si vous voulez "renuméroter" votre clé primaire: abandonner la clé primaire, renuméroter les identifiants puis recréer la clé primaire.

Questions connexes