Как я могу решить проблему ORACLE во внешнем ключе - PullRequest
0 голосов
/ 23 ноября 2018

У меня проблема с оракулом, и мне нужна помощь.У меня следующий запрос:

1 CREATE TABLE TEST1 (
2 NAME VARCHAR(20) 
3 ID  VAR(9) 
4 PRIMARY KEY(ID) 
5 FOREIGN KEY(NAME) References TEST2(ANAME) 
6 ON DELETE CASCADE ON UPDATE SET NULL );

Если я хочу удалить строку № 6, что мне делать?

1 Ответ

0 голосов
/ 25 ноября 2018

«Как я могу изменить значение первичного ключа и исходя из того, что внешние ключи этого ПК тоже будут меняться?»

Во-первых, вам никогда не нужно этого делать.Первичные ключи, подобные этому, на самом деле являются просто числами, которые идентифицируют строку, сами по себе они не имеют никакого значения.Это все равно, что спросить, как бы вы изменили ROWID строки.

Если нужно, вы можете:

  1. Найти внешние ключи, указывающие на эту таблицу, и отключить их с помощью ALTER CONSTRAINT myconstraint DISABLE
  2. Обновите вашу первичную таблицу и перехватите новое значение идентификатора с помощью UPDATE test1 SET id = mysequence.NEXTVAL WHERE id = :oldid RETURNING id INTO :newid, предполагая, что оно задано последовательностью.
  3. Обновите идентификаторы в других ваших таблицах с новым идентификатором.
  4. Повторно включите ваши ограничения.

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

AВторой подход заключается в следующем:

  1. Вставьте новую строку в первичную таблицу и перехватите новый идентификатор.
  2. Обновите идентификатор во внешних таблицах с новым идентификатором.
  3. Удалите старую строку в первичной таблице.

Теперь, когда я думаю об этом, второй подход кажется мне лучше.Нет DDL и кажется, что он чище.

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