【问题标题】:Changing keys and foreign keys更改键和外键
【发布时间】:2017-03-07 18:00:03
【问题描述】:

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

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

另一个叫服务:

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

我们遇到的问题是,我们需要将表 dogs 的 oldId 列 (CHAR(4)) 转换为自动递增的 INT 1,并更新服务表的相应 ServicedDog 列以具有新值(它是一个外来的钥匙)。我遇到的另一个问题是 ServicedDog 的数据类型是 CHAR(4),我需要将此列的数据类型更改为 INT。请告诉我,这怎么能做到? 谢谢

【问题讨论】:

    标签: mysql indexing insert foreign-keys


    【解决方案1】:

    (在没有看到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 上保留一个索引——用于转换;您可能想删除索引,甚至删除列。

    【讨论】:

    • 实际上,那个 oldId 在真正的数据库中被称为 Id(天哪!)。我的错。
    • 那么ALTERs 可能需要在执行其余步骤之前将 id 重命名为 oldid。
    猜你喜欢
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多