我在MySQL(innodb)(X,Y和Z)中有三个表。 X是一个超过1000万行的表,并且具有Y的主键作为外键。类似地,Z是具有超过3000万行的表,并且具有Y的主键作为外键。
现在的问题是Y的主键是VARCHAR(类似于md5哈希或GUID)。我想将此键移动到INT(AUTO_INCREMENT)。在没有用任何其他语言编写脚本的情况下,在mysql中实现此目的的方法是什么?
此外,表Z的主键也是VARCHAR(md5 / GUID)。我想将其更改为整数。 (它不是任何表中的外键)。
答案 0 :(得分:1)
(这可能或者可能不比Ritobroto的建议更好。)
假设X链接到Y.(根据需要调整所有FK。)
为每张桌子做这样的事情。
ALTER TABLE X.
DROP FOREIGN KEY ..., - 我们稍后会添加它
ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT, - 替换PK
DROP PRIMARY KEY, - 假设它是guid
添加PRIMARY KEY(id),
ADD INDEX(X_guid), - 丢失FK;仍然(现在)需要一个索引
ADD COLUMN Y_id INT UNSIGNED NOT NULL - 将来FK到Y.
获取新的ids
链接(以替换guids
)。对于每个链接:
更新X加入X.Y_guid = Y.guid SET x.y_id = y.id; (这将需要很长时间。
重新建立FK。对于每个表:
ALTER TABLE ...
添加外键......, - 绑定id
代替guid
DROP INDEX(X_guid); - 除非你需要别的东西
在试验机上练习!!
答案 1 :(得分:0)
第1步
创建具有相同列名的表,但是主键Y的数据类型应该在INT AUTO INCREMENT
中,表Z也是如此。
第2步
使用此查询:
INSERT INTO table_name (column_names of present table except the primary key column_name) SELECT all the columns except the primary key column FROM Y/Z(which ever table you want from the data to be inserted).
然后你可以放下原来的桌子 对于如此大量的数据来说,这是一个痛苦的过程,但会做你想要的。