我正在将旧的(非标准化)数据库迁移到新版本。
现在我有这个中间结果:
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;
两个表都填充了正确的数据:
tmp_email
中右fk_recipient = null
和comment
的一百万条评论(注意:电子邮件不是唯一的)recipient
中的数十万封UNIQUE电子邮件地址。我需要做什么:
我希望摆脱comment.tmp_email
列,而是将comment.fk_recipient
指向表recipient
中的相应行。
我当前的方法(使用PHP):
recipient
表格... DROP COLUMN tmp_email
这需要永远,让我想知道是否没有本地MySQL方法可以做到这一点?
答案 0 :(得分:1)
以下解决方法将完成此任务:
在comment.tmp_email
上创建临时外键:
ALTER TABLE comment ADD CONSTRAINT `tmpMailKey` FOREIGN KEY (`tmp_email`) REFERENCES `recipient`(`email`);
加入临时密钥上的两个表并使用该信息设置真正的外键:
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;
摆脱临时外键(以及tmp列):
ALTER TABLE `udw_v3`.`travelogue_guestbookentry` DROP COLUMN `tmp_email`, DROP INDEX `tmpMailKey`, DROP FOREIGN KEY `tmpMailKey`;