MySQL将主键从varchar移动到int

时间:2015-08-21 05:29:54

标签: 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_INCREMENT)。在没有用任何其他语言编写脚本的情况下,在mysql中实现此目的的方法是什么?

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

2 个答案:

答案 0 :(得分:1)

(这可能或者可能不比Ritobroto的建议更好。)

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

  1. 为每张桌子做这样的事情。

    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.

  2. 获取新的ids链接(以替换guids)。对于每个链接:

    更新X加入X.Y_guid = Y.guid     SET x.y_id = y.id; (这将需要很长时间。

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

    ALTER TABLE ...     添加外键......, - 绑定id代替guid     DROP INDEX(X_guid); - 除非你需要别的东西

  4. 在试验机上练习!!

答案 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).

然后你可以放下原来的桌子 对于如此大量的数据来说,这是一个痛苦的过程,但会做你想要的。