【问题标题】:MySQL moving primary key from varchar to intMySQL将主键从varchar移动到int
【发布时间】:2023-04-03 01:15:02
【问题描述】:
我在 MySQL (innodb) 中有三个表(X、Y 和 Z)。 X是一张超过1000万行的表,主键Y为外键。同理,Z是3000万行以上的表,主键Y为外键。
现在的问题是 Y 的主键是 VARCHAR(类似于 md5 哈希或 GUID)。我想将此键移至 INT (AUTO_INCREMENT)。有什么方法可以在 mysql 中实现这一点,而无需用任何其他语言编写脚本?
另外,表 Z 的主键也是一个 VARCHAR (md5/GUID)。我也想将其更改为整数。 (它不是任何表中的外键)。
【问题讨论】:
标签:
mysql
database
innodb
foreign-key-relationship
primary-key-design
【解决方案1】:
(这可能会也可能不会比 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 链接(以替换guids)。对于每个链接:
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
在测试机上练习吧!!
【解决方案2】:
第 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).
然后您可以删除原始表格。
对于这么多的数据,这是一个痛苦的过程,但会做你想做的事。