【问题标题】: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 的需要进行调整。)

    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
      

    在测试机上练习吧!!

    【讨论】:

      【解决方案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).
      

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

      【讨论】:

      • 您是否还需要重新建立 FK?
      • 是的,在新表上你必须再次建立 FK
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 2011-02-09
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      相关资源
      最近更新 更多