2017-03-07 139 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。 –