根据现有列数据设置外键值
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 都填充了正确的数据:
- 在 table
comment
中 tmp_email
和 fk_recipient = null
有几百万条评论(注意:电子邮件不是唯一的)
- table
recipient
. 中的数十万个唯一电子邮件地址
我需要做的事情:
我想删除 comment.tmp_email
列,而是将 comment.fk_recipient
指向 table recipient
.
中的相应行
我目前的做法(使用PHP):
- 获取所有评论
- 遍历所有评论:
- 查找
recipient
table 中的右行
- 设置正确的外键
... DROP COLUMN tmp_email
这需要很长时间,让我想知道是否没有本地 MySQL 方法来做到这一点?
以下解决方法可以解决问题:
在 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`;
我正在将旧的(未规范化的)数据库迁移到新版本。
现在我有这个中间结果:
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 都填充了正确的数据:
- 在 table
comment
中tmp_email
和fk_recipient = null
有几百万条评论(注意:电子邮件不是唯一的) - table
recipient
. 中的数十万个唯一电子邮件地址
我需要做的事情:
我想删除 comment.tmp_email
列,而是将 comment.fk_recipient
指向 table recipient
.
我目前的做法(使用PHP):
- 获取所有评论
- 遍历所有评论:
- 查找
recipient
table 中的右行
- 设置正确的外键
- 查找
... DROP COLUMN tmp_email
这需要很长时间,让我想知道是否没有本地 MySQL 方法来做到这一点?
以下解决方法可以解决问题:
在
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`;