Как переименовать значения первичного ключа в Oracle?

StackOverflow https://stackoverflow.com/questions/1849184

Вопрос

Наше приложение использует базу данных Oracle 10g, в которой конечному пользователю доступны несколько первичных ключей.Коды продуктов и тому подобное.К сожалению, уже слишком поздно что-либо с этим делать, поскольку существует множество отчетов и пользовательских скриптов, которые мы не можем контролировать.Мы не можем переопределить первичные ключи или испортить структуру базы данных.

Теперь некоторые клиенты хотят изменить некоторые значения первичного ключа.То, что изначально хотели назвать P23A1, теперь должно называться CAT23MOD1 (не реальный пример, но вы поняли, что я имею в виду).

Есть простой способ сделать это?Я бы предпочел какой-нибудь сценарий, который можно было бы параметризовать для соответствия другим таблицам и ключам, но внешние инструменты были бы приемлемы, если другого способа не существует.

Это было полезно?

Решение

Вероятно, проблема связана с внешними ключами, ссылающимися на ПК.Вы должны определить внешние ключи как «отложенные изначально немедленно», как описано в этой статье Тома Кайта: http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.htmlЭто позволяет вам...

  1. Отложите ограничения
  2. Изменить родительское значение
  3. Измените дочерние значения
  4. Зафиксируйте изменение

Простой.

Другие советы

Упс.Если немного погуглить, то окажется, что по необъяснимым причинам Oracle не реализует ON UPDATE CASCADE, а только ON DELETE CASCADE. Чтобы найти обходные пути, Google ORACLE ON UPDATE CASCADE.Вот ссылка на Создание набора таблиц каскадного обновления в Оракле.

Оригинальный ответ:

Если я правильно понимаю, вы хотите изменить ценности данных в столбцах первичного ключа, а не фактические имена ограничений самих ключей.

Если это правда, то проще всего это сделать, переопределив ВСЕ внешние ключи, которые ссылаются на затронутое ограничение первичного ключа, как ON UPDATE CASCADE.Это означает, что когда вы вносите изменение в значение первичного ключа, механизм автоматически обновляет все связанные значения в таблицах внешних ключей.

Имейте в виду, что если это приведет к множеству изменений, это может оказаться непомерно дорогим в производственной системе.

Если вам нужно сделать это в действующей системе без изменений DDL в задействованных таблицах, то я думаю, что ваш единственный вариант — это (для каждого значения PK, которое необходимо изменить):

  1. Вставьте в родительскую таблицу копию строки с замененным значением PK.
  2. Для каждой дочерней таблицы обновите значение FK до нового значения PK.
  3. Удалите строку родительской таблицы со старым значением PK.

Если у вас есть список родительских таблиц и значений PK, которые необходимо переименовать, не должно быть слишком сложно написать процедуру, которая делает это — информация в USER_CONSTRAINTS может использоваться для получения таблиц, связанных с FK, для данной родительской таблицы. .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top