MySQL 将主键从 varchar 移至 int

标签 mysql database innodb foreign-key-relationship primary-key-design

我在 MySQL (innodb) 中有三个表(X、Y 和 Z)。 X是一个超过1000万行的表,并且以Y为主键作为外键。同样,Z是超过3000万行的表,并且以Y为主键作为外键。

现在的问题是 Y 的主键是 VARCHAR(类似于 md5 哈希或 GUID)。我想将此键移至 INT (AUTO_INCRMENT)。有什么方法可以在 mysql 中实现此目的,而无需用任何其他语言编写脚本?

此外,表Z的主键也是VARCHAR(md5/GUID)。我也想将其更改为整数。 (它不是任何表中的外键)。

最佳答案

(这可能比 Ritobroto 的建议更好,也可能没有。)

假设 X 链接到 Y。(根据所有 FK 的需要进行调整。)

  1. 对每个表执行类似的操作。

    ALTER TABLE X
    DROP FOREIGN KEY ...,    -- We'll add it back later
    ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT,  -- Replacement PK
    DROP PRIMARY KEY,        -- Assuming it was `guid`
    ADD PRIMARY KEY(id),
    ADD INDEX(X_guid),       -- Lost the FK; still (for now) need an index
    ADD COLUMN Y_id INT UNSIGNED NOT NULL  -- future FK to Y
    ;
    
  2. 获取链接的新ids(以替换guid)。对于每个链接:

    UPDATE X JOIN Y ON X.Y_guid = Y.guid
    SET x.y_id = y.id;
    

    (这将需要很长时间。

  3. 重新建立 FK。对于每个表:

    ALTER TABLE ...
    ADD FOREIGN KEY ...,  -- to tie `id` instead of `guid`
    DROP INDEX(X_guid);   -- unless you need it for something else
    

在测试机上练习!!

关于MySQL 将主键从 varchar 移至 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32132961/

相关文章:

PHP MySQL根据用户复选框将行id保存到数据库

php - 在 App Engine for PHP 中优化 MySQL 连接的推荐方法是什么?

SQL:日期字段集中的最早日期

database - DynamoDB DAX 是否可横向扩展?

database - 登录后如何合并用户数据?

arrays - 从 mongo 嵌套数组中拉出

php - 带有动态链接的动态页面

mysql - Windows 7 MySQL 错误 1067 服务无法启动

jquery - 是否可以使用 jquery post 或 get 请求来保存访客统计信息?

mysql - innodb中复合主键的表是否支持组复制