programing

트리거 본문에서 동일한 테이블에 대한 다른 삭제를 포함하는 삭제 후 트리거를 작성하는 방법은 무엇입니까?

mytipbox 2023. 6. 27. 23:25
반응형

트리거 본문에서 동일한 테이블에 대한 다른 삭제를 포함하는 삭제 후 트리거를 작성하는 방법은 무엇입니까?

관계 스키마는 다음과 같습니다.

college(ID int, name text, grade int);
friend(ID1 int, ID2 int);
likes(ID1 int, ID2 int);

저는 우정 관계에서 대칭성을 유지하는 계기를 썼습니다.즉, 친구에서 (X, Y)가 삭제되면 (Y, X)도 삭제해야 합니다.

다음은 테이블 작성입니다.

create table college
(
    id    int auto_increment primary key,
    name  text not null,
    grade int  not null
);

create table likes
(
    id1 int not null,
    id2 int
);

create table friend
(
    id1 int not null,
    id2 int not null,
    constraint friend_pk
        primary key (id1, id2),
    constraint friend_college_id_fk
        foreign key (id1) references college (id)
    constraint friend_college_id_fk2
        foreign key (id2) references college (id)
);

저는 다음과 같은 트리거를 썼습니다.

delimiter //
drop trigger if exists Friend_Delete //
create trigger Friend_Delete
    after delete
    on friend
    for each row
begin
    delete
    from friend
    where id1 = OLD.id2
      and id2 = OLD.id1;
end //
delimiter ;

하지만 다음 질문을 실행하면,

delete from friend where id1 = 1 and id2 = 2;

저장된 함수/트리거의 '친구' 테이블이 이 저장된 함수/트리거를 호출한 문에서 이미 사용되고 있으므로 업데이트할 수 없습니다.

이 문제를 구글에 검색했더니 무한 반복 호출이 발생한다고 합니다.그런데 우리가 삭제 후라고 하면 삭제가 되고 여기서 다시 삭제를 할 수 없는 이유는 무엇입니까?

데이터베이스 엔진은 트리거의 무한 시퀀스를 시작하는 트리거를 작성할 수 없도록 합니다.코드의 논리를 보는 것이 아니라 계속 실행되는 일련의 트리거 작업을 시작하지 않도록 하는 것입니다.원래 삭제 후에는 "후" 여부는 중요하지 않습니다.

매우 일반적인 용어로 데이터베이스 코드보다는 응용 프로그램 코드로 처리하는 것이 좋습니다.트리거에는 여러 가지 문제가 있습니다. 테스트하기도 어렵고 디버깅하기도 어려우며, 개발자가 한 가지 작업(이 경우 행 삭제)을 수행하면 부작용이 발생하고(다른 행이 자동으로 삭제됨), 이상한 성능 문제가 발생할 수 있습니다(트리거 실행 순서가 계단식인 경우 데이터베이스 속도가 느린 것처럼 보일 수 있음).

delete from friend where id1 = 1 and id2 = 2;

위 쿼리에서 id1 = 1 id2 = 2인 행을 삭제하고 있습니다.

그런 다음 트리거가 ID1=2 ID2=1인 모든 행을 삭제하려고 합니다.

또한 Friend_Delete를 트리거하여 ID1=1ID2=2의 행을 삭제하며, 이것이 사용자가 처음으로 사용한 삭제 조건입니다.그래서 이런 방식의 재귀가 일어나고 있고 끝없는 순환이 만들어졌습니다.

언급URL : https://stackoverflow.com/questions/66329898/how-to-write-trigger-for-after-delete-which-contains-another-deletion-for-the-sa

반응형