我有两张桌子。第一个是狗:
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。请告诉我,这怎么办?
谢谢
最佳答案
(没有看到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
上保留索引-进行转换;您可能要删除索引,甚至可能删除列。