У меня сложилась такая ситуация, и я пытаюсь найти лучший способ ее решить. У меня есть база данных, скажем, DB-A, с таблицей T-A, которая имеет 2 поля - OID и PID. Эта таблица имеет около 1 миллиона строк. Теперь из-за какой-то другой проблемы PID большинства строк были неправильно установлены в 0, и это было найдено только через пару дней.
У меня есть резервная копия с двух дней назад, скажем, DB-B, и я думаю об обновлении DB-A с соответствующими записями из DB-B. Так что было бы лучшим способом сделать это? Я имею это в виду:
Ваши мысли очень ценятся...
спасибо Sunit
Если вы можете создать dblink из DB-A в DB-B, вы можете выполнить простое обновление из 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-1 между DBA.TA и DBB.TB, сначала я удалю DBA.TA, а затем изменим ответ Asmodon UPDATE на INSERT.
Если это невозможно, я отключу/удалю каждое ограничение/индекс на DBA.TA, сделаю обновления, а затем повторно включит/создаст ограничения/индексы.
С уважением.
Невозможно загрузить резервную копию как (например,) T-B и выполнить запрос типа:
UPDATE T-A, T-B SET T-A.pid = T-B.pid WHERE T-A.oid = T-B.oid
Извините мой MySQL-ese SQL, но теоретически это работает.
Для этого может быть встроенный инструмент, но если бы это был я, я бы, вероятно, использовал DB-B для создания списка операторов update
и запускал их как script в DB-A.
Что-то вроде:
select 'update T-A set PID = ' || PID || ' where OID = ' || OID || ';' from T-A
(Предполагается, что OID является вашим основным ключом. Поскольку у вас есть большое количество строк, вам может потребоваться разбить его на несколько сценариев. Кто-то может предложить более элегантное решение.)