我有这种情况,我正在考虑解决它的最佳方法。我有一个数据库,比如DB-A,有一个表T-A,它有2个字段--OID和PID。这张表有近100万行。现在由于其他一些问题,大多数行的PID被错误地设置为0,这只是在几天之后才发现。
我有两天前的备份,比如DB-B,我正在考虑用DB-B的匹配条目更新DB-A。那么最好的方法是什么呢?我有这个想法:
非常感谢您的想法...
感谢 苏尼特
答案 0 :(得分:1)
如果您可以构建从DB-A到DB-B的dblink,那么您可以从DB-A执行简单更新:
UPDATE (SELECT ta.pid ta_pid, tb.pid tb_pid
FROM ta ta
JOIN ta@backup tb ON (ta.oid = tb.oid))
SET ta_pid = tb_pid;
如果OID是主键,它将起作用。
答案 1 :(得分:0)
无法将备份加载为(例如)T-B并执行以下查询:
UPDATE T-A, T-B SET T-A.pid = T-B.pid WHERE T-A.oid = T-B.oid
请原谅我的MySQL-ese SQL,但从理论上说它可以工作。
答案 2 :(得分:0)
如果您在DBA.TA和DBB.TB之间有1-1关系,首先我会删除DBA.TA,然后将Asmodon的答案UPDATE更改为INSERT。
如果不可能,我将禁用/删除DBA.TA上的每个约束/索引,执行更新,然后重新启用/创建约束/索引。
问候。
答案 3 :(得分:-2)
可能有一个内置工具,但如果是我,我可能会使用DB-B生成update
语句列表,并将它们作为DB-A中的脚本运行。
类似的东西:
select 'update T-A set PID = ' || PID || ' where OID = ' || OID || ';' from T-A
(这假定OID是您的主键。由于您有大量行,您可能需要将其分解为多个脚本。其他人可能能够提供更优雅的解决方案。)