2017-03-07 3 views
0

J'ai deux tables. Le premier est le chien:Modification des clés et des clés étrangères

oldId name 
----- ----- 
'AX01' Fido 
'AX02' Pluto 
...  .... 

et un autre appelé viabilisée:

Id ServicedDog Descripton 
--- ------------ ---------- 
1 'AX01'  'Dog bath' 
2 'AX01'  'Dog Vaccined' 
... 
22 'AX02'  'Dog bath' 
... 

Le problème que nous avons est que nous devons convertir la colonne oldid (CHAR (4)) des chiens de table à une auto incrémentée INT et mettez à jour la colonne ServicedDog respective de la table desservie pour avoir les nouvelles valeurs (c'est une clé étrangère). Un autre des problèmes que j'ai est le type de données pour ServicedDog est CHAR (4) et je devrai changer le type de données de cette colonne en INT. S'il vous plaît, dites-moi, comment cela peut-il être fait? Merci

Répondre

0

(Sans voir SHOW CREATE TABLE pour ce que vous avez, je fais quelques suppositions.)

Est-il vraiment appelé oldid maintenant?

-- Add the desired id (and populate it); 
-- Replace the existing PK: 
ALTER TABLE dogs 
    ADD COLUMN id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL, 
    DROP PRIMARY KEY, 
    ADD PRIMARY KEY(id) 
    ADD INDEX(oldid); 

-- add new dog_id (but do not populate) 
ALTER TABLE serviced 
    ADD COLUMN dog_id SMALLINT UNSIGNED NOT NULL, 
    ADD INDEX(dog_id); 

-- establish new linkage: 
UPDATE serviced 
    JOIN dogs ON serviced.oldid = dogs.oldid 
    SET serviced.dog_id = dogs.id; 

Notes:

  • Suppose oldid est vraiment le nom actuel de cette colonne. On suppose qu'il n'y a pas plus de 64 000 chiens (SMALLINT UNSIGNED); changez la déclaration si vous en avez plus. Conserve un index sur oldid - pour la conversion; vous voudrez peut-être supprimer l'index et peut-être même la colonne.
+0

En fait, oldId s'appelle Id au vrai DB (oh boy!). Mon erreur. –

+0

Ensuite, le 'ALTERs' doit probablement renommer id à oldid avant de faire le reste de ses étapes. –