MySQL(innodb)(X,Y和Z)中有三个表 . X是一个超过1000万行的表,并且具有Y的主键作为外键 . 类似地,Z是具有超过3000万行的表并且具有作为外键的Y的主键 .
现在问题是Y的主键是VARCHAR(类似于md5哈希或GUID) . 我想将此键移动到INT(AUTO_INCREMENT) . 在没有用任何其他语言编写脚本的情况下,在mysql中实现此目的的方法是什么?
另外,表Z的主键也是VARCHAR(md5 / GUID) . 我想将其更改为整数 . (它不是任何表中的外键) .
2 回答
(这可能或者可能不比Ritobroto的建议更好 . )
假设X链接到Y.(根据需要调整所有FK . )
ALTER TABLE X DROP FOREIGN KEY ..., - 我们稍后会添加它ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT, - 替换PK DROP PRIMARY KEY, - 假设它是
guid
ADD PRIMARY KEY(id),ADD INDEX (X_guid), - 失去了FK;仍然(现在)需要索引ADD COLUMN Y_id INT UNSIGNED NOT NULL - 将来FK到Y;ids
链接(以替换guids
) . 对于每个链接:UPDATE X JOIN Y ON X.Y_guid = Y.guid SET x.y_id = y.id; (这将需要很长时间 .
ALTER TABLE ...添加FOREIGN KEY ..., - 绑定
id
而不是guid
DROP INDEX(X_guid); - 除非你需要别的东西在试验机上练习!!
Step 1
创建具有相同列名的表但Y的主键的数据类型应该在
INT AUTO INCREMENT
中,表Z也是如此 .Step 2
使用此查询:
然后你可以删除原始表 .
对于如此大量的数据来说,这是一个痛苦的过程,但会做你想要的 .