我从一个旧数据库继承而来,每个公司部门拆分的数据非常相似。我的目标是将所有内容合并到一个架构中。由于每个部门架构都有自己的唯一ID,因此我需要在合并后使用新ID更新外键。
为了举例说明我的问题,让我们考虑以下两个表:
foobar
id name foreign_id
-- ---- ----------
1 foo 4
2 bar 6
3 baz 8
4 qux 4
翻译
old_id new_id
------ ------
7 3
9 4
8 9
4 1
6 5
转换表表示从旧ID(每个部门)到新ID(在合并模式中)的迁移信息。
我想更新所有外键以将旧ID替换为新ID。
完全手动的解决方案是执行以下操作:
UPDATE foobar SET foreign_id = 3 WHERE foreign_id = 7
...
但是此解决方案最终会产生冲突,因此我可以改用临时列:
UPDATE foobar SET new_foreign_id = 3 WHERE foreign_id = 7
...
然后放下foreign_id
列并重命名new_foreign_id
。
我正在寻找一种更简单的解决方案,可以执行以下操作:
UPDATE foobar SET foreign_id = new_id
FOREACH -- <-- Magic keyword
SELECT * FROM foobar LEFT JOIN translate ON old_id = foreign_id
这可能吗?
答案 0 :(得分:2)
您可以使用UPDATE
+ JOIN
。例如:
UPDATE foobar
RIGHT JOIN translate ON translate.old_id = foobar.foreign_id
SET foobar.foreign_id = translate.new_id