我在 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 的需要进行调整。)
对每个表执行类似的操作。
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 ;
获取链接的新
ids
(以替换guid
)。对于每个链接:UPDATE X JOIN Y ON X.Y_guid = Y.guid SET x.y_id = y.id;
(这将需要很长时间。
重新建立 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/