«Как я могу изменить значение первичного ключа и исходя из того, что внешние ключи этого ПК тоже будут меняться?»
Во-первых, вам никогда не нужно этого делать.Первичные ключи, подобные этому, на самом деле являются просто числами, которые идентифицируют строку, сами по себе они не имеют никакого значения.Это все равно, что спросить, как бы вы изменили ROWID
строки.
Если нужно, вы можете:
- Найти внешние ключи, указывающие на эту таблицу, и отключить их с помощью
ALTER CONSTRAINT myconstraint DISABLE
- Обновите вашу первичную таблицу и перехватите новое значение идентификатора с помощью
UPDATE test1 SET id = mysequence.NEXTVAL WHERE id = :oldid RETURNING id INTO :newid
, предполагая, что оно задано последовательностью. - Обновите идентификаторы в других ваших таблицах с новым идентификатором.
- Повторно включите ваши ограничения.
Обратите внимание, что изменение ограничений - это DDL, и при этом будет выполняться неявное принятие, и этот подход оставит ваши таблицы незащищенными из-за ограничений внешнего ключа.
AВторой подход заключается в следующем:
- Вставьте новую строку в первичную таблицу и перехватите новый идентификатор.
- Обновите идентификатор во внешних таблицах с новым идентификатором.
- Удалите старую строку в первичной таблице.
Теперь, когда я думаю об этом, второй подход кажется мне лучше.Нет DDL и кажется, что он чище.