Oracle - удаление дочерних строк - PullRequest
4 голосов
/ 12 августа 2011

Есть ли способ принудительно удалить все зависимые строки (дочерние строки) при удалении родительской строки таблицы.

У меня есть таблица со слишком большим количеством ссылочной целостности. Мне было интересно, как проще всего добиться этого в оракуле.

Я ценю вашу поддержку.

1 Ответ

9 голосов
/ 12 августа 2011

Вы можете объявить ограничения внешнего ключа, которые удаляются каскадом, чтобы дочерние строки автоматически удалялись при удалении родительской строки.

SQL> create table parent (
  2    parent_key number primary key
  3  );

Table created.

SQL> create table child (
  2    child_key number primary key,
  3    parent_key number,
  4    constraint fk_child_parent foreign key( parent_key )
  5      references parent( parent_key )
  6      on delete cascade
  7  );

Table created.

SQL> insert into parent values( 1 );

1 row created.

SQL> insert into child values( 10, 1 );

1 row created.

SQL> commit;

Commit complete.

SQL> delete from parent where parent_key = 1;

1 row deleted.

SQL> select * from child;

no rows selected

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

...