Изменить большое количество ключей записи с помощью таблицы карт - PullRequest
4 голосов
/ 02 ноября 2009

У меня есть набор записей, проиндексированных по номерам идентификаторов, мне нужно преобразовать индексы этих записей в новый номер идентификатора. У меня есть таблица из двух столбцов, отображающая старые числа на новые.

Например, с учетом этих двух таблиц, как будет выглядеть оператор обновления?

Дано:

   OLD_TO_NEW
oldid   |   newid
-----------------
1234        0987
7698        5645
...         ...

и

id      |   data
----------------
1234        'yo'
7698        'hey'
...         ...

Требуется:

id      |   data
----------------
0987        'yo'
5645        'hey'
...         ...

Этот оракул, поэтому у меня есть доступ к PL / SQL, я просто пытаюсь его избежать.

Ответы [ 5 ]

4 голосов
/ 02 ноября 2009

У меня будет уникальный индекс для OLD_TO_NEW.oldid и обновление для встроенного представления:

update (select id,
               newid
          from old_to_new,
               my_table
         where my_table.id = old_to_new.oldid)
set id = newid
2 голосов
/ 02 ноября 2009
UPDATE base_table SET id = (SELECT newid FROM old_to_new WHERE oldid = id)

Вот так я бы сделал это в MySQL, и я думаю, что это довольно стандартно.

0 голосов
/ 02 ноября 2009

Сначала сделайте резервную копию базы данных. Я также лично сделал бы резервную копию таблицы в рабочей базе данных на случай, если что-то пойдет не так, и вам нужно в срочном порядке вернуться к старому способу.

Следующая проблема в том, есть ли у вас связанные таблицы, которым также понадобятся эти идентификаторы? Если нет, то вы можете обновить с помощью оператора обновления. Напишите свой статус обновления, чтобы вы могли сделать выбор и убедиться, что он будет обновляться правильно. Если вы делаете много записей, вы можете делать это партиями, скажем, 1000 записей за раз. Одна ситуация, которую вам, возможно, нужно остерегаться, это если значения идентификаторов перекрываются, прямое обновление может не работать (вы столкнетесь с уникальным индексом). В этом случае вам нужно добавить столбец, заполнить его новыми значениями, затем удалить старый столбец и переименовать новый. Вы также должны будете написать все индексы, fks и т. Д., Потому что вам также нужно будет их повторно запустить.

Связанные таблицы становятся намного сложнее, но новый столбец - лучший способ пойти и в этом случае.

0 голосов
/ 02 ноября 2009

Вот как я бы это сделал в Microsoft SQL Server 2005. У меня не было доступа к базе данных Oracle в течение многих лет, поэтому это может не сработать для Oracle.

UPDATE target_table
SET id = newid
FROM OLD_TO_NEW
WHERE target_table.id = OLD_TO_NEW.oldid;

Возможно, вы захотите проиндексировать OLD_TO_NEW.oldid, чтобы объединение обновлений могло работать эффективно.

0 голосов
/ 02 ноября 2009

Оба оператора обновления от Рамона и Дэвида Олдриджа должны работать нормально, но в зависимости от количества обновляемых записей работа с временной таблицей может быть быстрее:

 create table temp as (
      select newid, data
      from old_to_new join my_table on my_table.id = old_to_new.oldid);

Затем обрежьте старую таблицу и скопируйте временную таблицу в старую таблицу или удалите старую таблицу и переименуйте временную таблицу. (Примечание. Добавьте несколько дополнительных операторов для обработки записей, в которых у вас нет новых значений.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...