首页 文章

MySQL将主键从varchar移动到int

提问于
浏览
0

MySQL(innodb)(X,Y和Z)中有三个表 . X是一个超过1000万行的表,并且具有Y的主键作为外键 . 类似地,Z是具有超过3000万行的表并且具有作为外键的Y的主键 .

现在问题是Y的主键是VARCHAR(类似于md5哈希或GUID) . 我想将此键移动到INT(AUTO_INCREMENT) . 在没有用任何其他语言编写脚本的情况下,在mysql中实现此目的的方法是什么?

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

2 回答

  • 1

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

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

    • 为每张 table 做这样的事情 .

    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; (这将需要很长时间 .

    • 重新 Build FK . 对于每个表:

    ALTER TABLE ...添加FOREIGN KEY ..., - 绑定 id 而不是 guid DROP INDEX(X_guid); - 除非你需要别的东西

    在试验机上练习!!

  • 0

    Step 1
    创建具有相同列名的表但Y的主键的数据类型应该在 INT AUTO INCREMENT 中,表Z也是如此 .

    Step 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).
    

    然后你可以删除原始表 .
    对于如此大量的数据来说,这是一个痛苦的过程,但会做你想要的 .

相关问题