【问题标题】:Set foreign key values based on existing column data根据现有列数据设置外键值
【发布时间】:2016-04-06 06:32:39
【问题描述】:

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

现在我有这个中间结果:

 创建表收件人(
        id int NOT NULL AUTO_INCREMENT,
        电子邮件 VARCHAR(255),
        主键(id),
        唯一索引(`电子邮件`),
    ) 引擎=创新;

    创建表评论(
        # 现在这总是 NULL:
        fk_recipient INT,
        # 临时解决方案。请注意,此字段不是唯一的:
        tmp_email VARCHAR(255) 非空,
        # ...
        外键(`fk_recipient`)参考收件人(id);
    ) 引擎=INNODB;

两个表都填写了正确的数据:

  • 在表comment 中有数百万个具有正确tmp_emailfk_recipient = null 的cmets(注意:电子邮件不是唯一的)
  • recipient 表中有数十万个 UNIQUE 电子邮件地址。

我需要做什么:

我想删除comment.tmp_email 列,而是将comment.fk_recipient 指向表recipient 中的相应行。

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

  1. 获取所有 cmets
  2. 遍历所有 cmets:
    • recipient 表中查找右行
    • 设置右外键
  3. ... DROP COLUMN tmp_email

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

【问题讨论】:

    标签: mysql foreign-keys database-normalization


    【解决方案1】:

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

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

      ALTER TABLE 注释
          添加约束`tmpMailKey`外键(`tmp_email`)
          参考 `recipient`(`email`);
    2. 在临时键上加入两个表,并使用信息设置真正的外键:

      更新评论 c
      INNER JOIN 接收者 r
      上
              c.tmp_email = r.email
          并且 c.tmp_email 不为空
      SET c.fk_recipient = r.id;
    3. 摆脱临时外键(以及 tmp 列):

      ALTER TABLE `udw_v3`.`travelogue_guestbookentry`
          删除列`tmp_email`,
          删除索引`tmpMailKey`,
          删除外键`tmpMailKey`;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 2022-08-03
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多