0

我在 MySQL (innodb) (X、Y 和 Z) 中有三个表。X是一张超过1000万行的表,主键Y为外键。类似地,Z 是超过 3000 万行的表,主键为 Y 作为外键。

现在的问题是 Y 的主键是 VARCHAR(类似于 md5 哈希或 GUID)。我想将此键移至 INT (AUTO_INCREMENT)。有什么方法可以在 mysql 中实现这一点,而无需用任何其他语言编写脚本?

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

4

2 回答 2

3

(这可能会也可能不会比 Ritobroto 的建议更好。)

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

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

    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
    ;
    
  2. 获取新的ids链接(以替换guids)。对于每个链接:

    UPDATE X JOIN Y ON X.Y_guid = Y.guid
    SET x.y_id = y.id;
    

    (这将需要很长时间。

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

    ALTER TABLE ...
    ADD FOREIGN KEY ...,  -- to tie `id` instead of `guid`
    DROP INDEX(X_guid);   -- unless you need it for something else
    

在测试机上练习!!

于 2015-08-22T00:58:36.383 回答
0

步骤 1
创建列名相同的表,但 Y 的主键数据类型应为 in 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).

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

于 2015-08-21T05:45:57.260 回答