Я бы предположил, что всегда можно провести рефакторинг плохих или устаревших проектов баз данных, это просто зависит от того, сколько работы вы готовы выполнить для этого.
Если вы хотите заменить определенные пользователем данные суррогатным ключом, тогда вы сможете просто изменить существующую таблицу, чтобы она содержала столбец идентификаторов, не допускающий обнуления, и это должно привести к тому, что всем существующим записям будет присвоен новый ключ автоматически.
Как только новое поле заполняется уникальными идентификаторами, если вам нужно переместить и заменить ссылки на внешние ключи этой таблицы, тогда я просто изменил бы эти таблицы, чтобы они содержали новое поле, и использовал что-то вроде следующего:
UPDATE child_table
SET new_fk_val =
SELECT new_pk_val
FROM parent_table
WHERE parent_table.old_pk_val = child_table.old_fk_val
После завершения этого шага вы можете удалить старое ограничение внешнего ключа, удалить старый столбец внешнего ключа, удалить старый столбец первичного ключа, установить новое ограничение первичного ключа и затем установить новое ограничение внешнего ключа.
Конечно, если старая версия отношений родительской и дочерней таблиц была такова, что у вас есть недопустимые записи в дочерней таблице, вам, возможно, придется сделать что-то вроде следующего:
DELETE FROM child_table
WHERE old_fk_val NOT IN
( SELECT old_pk_val FROM parent_table)