programing

SQL 스크립트 하나로 하위 및 상위 행 삭제

javajsp 2023. 7. 8. 10:36

SQL 스크립트 하나로 하위 및 상위 행 삭제

하위 행을 삭제한 다음 다른 SQL 문을 작성하여 상위 행을 삭제하는 대신 두 가지를 모두 수행하는 하나의 문을 사용하고 싶었습니다.참고로 Oracle 데이터베이스를 사용합니다.

업데이트: 캐스케이드에서 DELETE ON CASCADE를 수행할 권한이 없습니다.

단계적 삭제를 사용하여 외부 키를 정의합니다.그런 다음 "부모" 행만 삭제하면 됩니다.

비교적 크고 매우 중요한 데이터베이스에서 이 문제에 대해 정말로 좋지 않은 경험을 한 후, 저는 그것을 위해 실버 총알을 만들기로 결심했습니다! 왜냐하면 저는 아무것도 찾을 수 없었기 때문입니다!실제로 이 스레드의 솔루션/답변 중 문제의 요구 사항을 충족하는 것은 없습니다.

내 깃허브에서 캐스케이드릿 레포를 참조하십시오.

delete from 
(
select * from parent join child using (id)
where id = 1
)

경고!상위 행과 하위 행이 모두 있는 위치만 삭제합니다.자녀가 없는 부모는 삭제하지 않습니다.

트리거를 사용하는 등의 방법으로만 잘못 수행할 수 있습니다.

create table parent
(pid number,
   constraint parent_pk
     primary key (pid)
     using index
);

create table child
  (cid number,
   pid number,
   constraint child_pk
     primary key(cid)
     using index,
   constraint child_fk
     foreign key (pid)
     references parent (pid)
  );

create index child_fk on child (pid);

create trigger fake_delete_cascade
before delete on parent
for each row
begin
  delete from child where pid = :old.pid;
end;
/

insert into parent values (1);
insert into child values (1,1);
commit;
select count(*) from child;
delete from parent where pid = 1;
select count(*) from child;

부모 행을 삭제할 때 항상 자식을 삭제하려면 외부 키 제약 조건을 선언하여 Oracle이 자식을 자동으로 삭제하도록 할 수 있습니다.

create table parent (
  parentID number primary key,
  parentData varchar2(100)
);

create table child (
  childID number primary key,
  parentID number references parent( parentID ) on delete cascade,
  childData varchar2(100)
);

예를 들어, 에서는 부모 테이블과 자식 테이블을 선언하고 부모 행을 삭제할 때 자식 행을 자동으로 삭제합니다.이러한 종류의 작업이 자동으로 수행되는 것을 원하지 않거나 백그라운드에서 "자동으로" 발생할 때 추가되는 복잡성이 싫다면 여러 개를 사용해야 할 수도 있습니다.DELETE진술들.

또 다른 방법(지루한 방법으로, 알 수 없는 이유로 외부 키를 제약 조건으로 사용하지 않는 데이터베이스에 있음 - 예)을 수행하려면 삭제 후(또는 삭제 전) 트리거를 생성해야 합니다.

다른 삭제 쿼리를 작성해야 하지만 트리거에서만 작성할 수 있습니다.

하지만 캐스케이드를 삭제할 수 없다면 트리거를 추가할 수 있을지 모르겠습니다.

다른 사람에게 도움이 될 경우를 대비하여 이 스택 오버플로 질문의 도움을 받아 테이블의 모든 외부 키 제약 조건에 대해 이 작업을 수행하기 위해 PLSQL 스크립트를 작성했습니다.도움이 되길 바랍니다.

DECLARE
  CURSOR constraint_cursor IS SELECT *
                              FROM (SELECT a.table_name,
                                           a.constraint_name,
                                           a.column_name,
                                           c_pk.table_name r_table_name,
                                           b.column_name   r_column_name
                                    FROM user_cons_columns a
                                           JOIN user_constraints c ON a.owner = c.owner
                                                                        AND a.constraint_name = c.constraint_name
                                           JOIN user_constraints c_pk ON c.r_owner = c_pk.owner
                                                                           AND
                                                                         c.r_constraint_name = c_pk.constraint_name
                                           JOIN user_cons_columns b ON C_PK.owner = b.owner
                                                                         AND
                                                                       C_PK.CONSTRAINT_NAME = b.constraint_name AND
                                                                       b.POSITION = a.POSITION
                                    WHERE c.constraint_type = 'R'
                                      and c_pk.owner = 'YOUR SCHEMA HERE') tbl;
  sql_statement VARCHAR2(2048) := NULL;
  tab_row       constraint_cursor%rowtype;
BEGIN
  OPEN constraint_cursor;
  FOR i in 1..80 LOOP
    FETCH constraint_cursor into tab_row;
    EXECUTE IMMEDIATE 'ALTER table ' || tab_row.table_name || ' drop constraint ' || tab_row.constraint_name;
    EXECUTE IMMEDIATE 'ALTER table ' || tab_row.table_name || ' add constraint ' || tab_row.constraint_name || ' FOREIGN KEY (' ||
    tab_row.column_name || ') references ' || tab_row.r_table_name || '(' || tab_row.r_column_name || ') ON DELETE CASCADE ';
  end loop;
  close constraint_cursor;
end;

언급URL : https://stackoverflow.com/questions/9640340/delete-a-child-and-a-parent-row-with-one-sql-script