2017-03-07 135 views
0

我有兩個表。第一個是狗:更改密鑰和外鍵

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

和另一個叫服務:

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

我們的問題是,我們需要將OLDID列轉換(CHAR(4))表狗自動的遞增INT 1,並更新服務的表的相應ServicedDog列以獲得新值(它是外鍵)。我遇到的另一個問題是ServicedDog的數據類型是CHAR(4),我需要將此列的數據類型更改爲INT。請告訴我,這怎麼辦? 感謝

回答

0

(沒有看到SHOW CREATE TABLE對你有什麼,我做了一些猜測。)

難道真的叫oldid現在?

-- 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; 

注:

  • 假設oldid真的是該列的當前名稱。
  • 假設有不超過64K的狗(SMALLINT UNSIGNED);如果你有更多的話可以更改聲明。
  • 保留索引oldid - 用於轉換;你可能想要刪除索引,甚至可能是列。
+0

實際上,那個oldId在真正的DB(哦,男孩!)中被稱爲Id。我的錯。 –

+0

然後,在執行其餘的步驟之前,ALTERs可能需要將id重命名爲oldid。 –