我有两张桌子。第一个是狗:

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上保留索引-进行转换;您可能要删除索引,甚至可能删除列。

10-05 20:45