syam1986 Ответов: 1

Как удалить данные во всех дочерних таблицах, включая родительскую таблицу.


У меня есть несколько таблиц, имеющих ограничительные отношения с внешними ключами, как показано ниже:

1.parent_table id(первичный ключ)
2.parent_child основные достижения и итоговые документы(первичный ключ) и ID(справка из parent_table)
3.ребенок ch_id(первичный ключ) и основные достижения и итоговые документы(справка из parent_child стол)

Теперь мне нужно удалить запись из parent_table, в том числе с дочерними таблицами, которые имеют одну и ту же запись. Но здесь я получаю вызов-parent_table ссылается на таблицу parent_child, но таблица parent_child ссылается на дочернюю таблицу с другим столбцом.

Как я могу определить точное значение из дочерних таблиц, чтобы удалить эту конкретную запись?

Заранее спасибо.

Что я уже пробовал:

create table parent(id number primary key,name varchar2(30));

create table parent_child(c_id number primary key,id number,name varchar2(30));

ALTER TABLE parent_child ADD
    CONSTRAINT parent_child_fk FOREIGN KEY (id)
       REFERENCES parent(id);
       
create table child(ch_id number primary key,c_id number,name varchar2(30));

ALTER TABLE child ADD
    CONSTRAINT child_fk FOREIGN KEY (c_id)
       REFERENCES parent_child(c_id);


I have tried below query to find the tables:

<pre>
SELECT DISTINCT LEVEL,  PT AS "TNAME",COLUMN_NAME
            FROM (SELECT A.OWNER W1,
                         A.table_name PT,
                         A.constraint_name C1,
                         A.r_constraint_name R1,
                         B.OWNER W2,
                         B.table_name CT,
                         B.constraint_name C2,
                         B.r_constraint_name R2,
                         C.COLUMN_NAME
                    FROM ALL_CONSTRAINTS A, all_constraints B,ALL_CONS_COLUMNS C
                   WHERE     (A.constraint_name = b.r_constraint_name(+))
                   AND A.CONSTRAINT_NAME=C.CONSTRAINT_NAME
                         AND A.OWNER = UPPER ('USER')
                         AND B.OWNER(+) = UPPER ('USER') 
                         AND A.r_constraint_name IS NULL
                         AND A.constraint_type IN ('P', 'R')) V1
      START WITH PT = UPPER ('PARENT') 
      CONNECT BY PRIOR CT = PT AND LEVEL <= 10 ORDER BY LEVEL


:: Этот запрос возвращает только имена столбцов.. Я хотел бы поместить этот запрос в неявный курсор и найти значения со значением столбца родительской таблицы.

Maciej Los

Что ж... вы должны решить, чего вы хотите достичь: как только вы скажете: "я хочу удалить, но позже: "найти значения"...

1 Ответов

Рейтинг:
2

Maciej Los

Пожалуйста, прочтите мой комментарий к этому вопросу...

Если вы хотите удалить, я настоятельно рекомендую прочитать это: Oracle / PLSQL: внешние ключи с каскадным удалением[^]


syam1986

Мои существующие таблицы не содержат "ON DELETE CASCADE".

Maciej Los

Итак, вы должны изменить таблицы ;)

Maciej Los

Да, это так. Я не могу вам помочь, потому что у меня нет доступа к вашему жесткому диску или/и я не вижу ваших данных. Это ваша работа, чтобы прочитать справочную документацию и решить вашу проблему.