MySQL 将主键从 varchar 移至 int
MySQL moving primary key from varchar to int
我在 MySQL (innodb) 中有三个 table(X、Y 和 Z)。 X 是一个 table 有超过 1000 万行,并且有 Y 的主键作为外键。同样,Z table 超过 3000 万行,外键为 Y 的主键。
现在的问题是 Y 的主键是 VARCHAR(类似于 md5 散列或 GUID)。我想将此键移至 INT (AUTO_INCREMENT)。有什么方法可以在 mysql 中实现这一目标,而无需使用任何其他语言编写脚本?
此外,table Z 的主键也是 VARCHAR (md5/GUID)。我也想将其更改为整数。 (它不是任何 table 中的外键)。
步骤 1
创建具有相同列名的tables,但Y的主键数据类型应为INT AUTO INCREMENT
,table 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).
那你就可以drop原来的table.
对于如此大量的数据,这是一个痛苦的过程,但会做你想做的。
(这可能比 Ritobroto 的建议好,也可能不好。)
假设 X links 到 Y。(根据所有 FK 的需要进行调整。)
对每个 table 做这样的事情。
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
linked(以替换 guids
)。对于每个 link:
UPDATE X JOIN Y ON X.Y_guid = Y.guid
SET x.y_id = y.id;
(这会花很长时间。
重新建立FK。对于每个 table:
ALTER TABLE ...
ADD FOREIGN KEY ..., -- to tie `id` instead of `guid`
DROP INDEX(X_guid); -- unless you need it for something else
在测试机上实践一下!!
我在 MySQL (innodb) 中有三个 table(X、Y 和 Z)。 X 是一个 table 有超过 1000 万行,并且有 Y 的主键作为外键。同样,Z table 超过 3000 万行,外键为 Y 的主键。
现在的问题是 Y 的主键是 VARCHAR(类似于 md5 散列或 GUID)。我想将此键移至 INT (AUTO_INCREMENT)。有什么方法可以在 mysql 中实现这一目标,而无需使用任何其他语言编写脚本?
此外,table Z 的主键也是 VARCHAR (md5/GUID)。我也想将其更改为整数。 (它不是任何 table 中的外键)。
步骤 1
创建具有相同列名的tables,但Y的主键数据类型应为INT AUTO INCREMENT
,table 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).
那你就可以drop原来的table.
对于如此大量的数据,这是一个痛苦的过程,但会做你想做的。
(这可能比 Ritobroto 的建议好,也可能不好。)
假设 X links 到 Y。(根据所有 FK 的需要进行调整。)
对每个 table 做这样的事情。
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
linked(以替换guids
)。对于每个 link:UPDATE X JOIN Y ON X.Y_guid = Y.guid SET x.y_id = y.id;
(这会花很长时间。
重新建立FK。对于每个 table:
ALTER TABLE ... ADD FOREIGN KEY ..., -- to tie `id` instead of `guid` DROP INDEX(X_guid); -- unless you need it for something else
在测试机上实践一下!!