根据现有列数据设置外键值

Set foreign key values based on existing column data

我正在将旧的(未规范化的)数据库迁移到新版本。

现在我有这个中间结果:

    CREATE TABLE recipient(
        id int NOT NULL AUTO_INCREMENT,
        email VARCHAR(255),
        PRIMARY KEY (id),
        UNIQUE INDEX (`email`),
    ) ENGINE=INNODB;

    CREATE TABLE comment(
        # Right now this is always NULL:
        fk_recipient INT,
        # Temporary solution. Note that this field is NOT UNIQUE:
        tmp_email VARCHAR(255) NOT NULL,
        # ...
        FOREIGN KEY (`fk_recipient`) REFERENCES recipient(id);
    ) ENGINE=INNODB;

两个 table 都填充了正确的数据:

我需要做的事情:

我想删除 comment.tmp_email 列,而是将 comment.fk_recipient 指向 table recipient.

中的相应行

我目前的做法(使用PHP):

  1. 获取所有评论
  2. 遍历所有评论:
    • 查找 recipient table
    • 中的右行
    • 设置正确的外键
  3. ... DROP COLUMN tmp_email

这需要很长时间,让我想知道是否没有本地 MySQL 方法来做到这一点?

以下解决方法可以解决问题:

  1. comment.tmp_email 上创建临时外键:

    ALTER TABLE comment
        ADD CONSTRAINT `tmpMailKey` FOREIGN KEY (`tmp_email`)
        REFERENCES `recipient`(`email`);
  2. 在临时键上加入两张表,利用信息设置真正的外键:

    UPDATE comment c
    INNER JOIN recipient r
    ON
            c.tmp_email = r.email
        AND c.tmp_email IS NOT NULL
    SET c.fk_recipient = r.id;
  3. 删除临时外键(以及 tmp 列):

    ALTER TABLE `udw_v3`.`travelogue_guestbookentry`
        DROP COLUMN `tmp_email`,
        DROP INDEX `tmpMailKey`,
        DROP FOREIGN KEY `tmpMailKey`;