programing

캐스케이드 삭제 시 호출 트리거

topblog 2023. 10. 5. 21:05
반응형

캐스케이드 삭제 시 호출 트리거

MySQL에 A 테이블이 있습니다.캐스케이드를 다른 테이블("B", "C", "D"...)로 삭제하는 것과 관련된 일부 참조가 있습니다.A에서 무언가가 삭제되면 트리거를 사용해야 합니다.이 트리거는 내가 "A"에서 직접 레코드를 삭제할 때 작동합니다.그러나 캐스케이드 삭제에서는 작동하지 않습니다.내 트리거가 캐스케이드 삭제와 함께 작동하는 MySQL 버전이 있습니까?아니면 다른 방법으로 전화를 걸 수도 있고,

출처: http://dev.mysql.com/doc/refman/5.6/en/innodb-restrictions.html

계단식 외부 키 작업이 트리거를 활성화하지 않음

즉, 계단식 삭제에서는 트리거를 사용할 수 없습니다.

관련 버그 참고:

  • MySQL: https://bugs.mysql.com/bug.php?id=11472
  • MariaDB: https://jira.mariadb.org/browse/MDEV-19402

@Niel de Wet와 @Browny Lin의 답변을 요약하면 다음과 같습니다.

  1. 안타깝게도 계단식 삭제는 MySQL에서 트리거를 활성화하지 않습니다.
  2. 한 가지 해결책은 계단식 삭제를 사용하지 않고 다른 트리거를 통해 자동 삭제를 구현하는 것입니다.

이 문제가 존재한다는 것을 처음 발견한 날부터 제가 어떻게 이 문제를 "고치고" 있는지 공유하겠습니다.계단식 테이블에서 트리거를 직접 삭제된 첫 번째 테이블로 복사합니다.그냥 되는 거지.

복사/붙여넣기의 문제가 되는 경우가 많으며, 때로는 코드를 광범위하게 다시 작성해야 하는 경우도 있습니다.

가장 좋은 점은 오라클이 이 버그를 최종적으로 수정할 때 해당 테이블에서 트리거 코드만 제거하면 된다는 것입니다.Voila!

네 불행하게도 이건 벌레입니다.하지만 우리는 우리가 필요로 하는 것을 성취하기 위해 무언가를 할 수 있습니다.CASCADE 업데이트 또는 삭제를 위해 외부 키를 정의하는 대신 트리거를 만들어 이를 달성할 수 있습니다.

예를 들어 테이블이 2개인 경우categories그리고.subcategories하위 범주에 할당된 외부 키가 있으므로 범주를 삭제하면 하위 범주가 자동으로 삭제됩니다.다음과 같이 트리거를 사용하여 외부 키 없이도 동일한 기능을 수행할 수 있습니다.

CREATE TRIGGER categories_delete AFTER DELETE ON categories
    FOR EACH ROW BEGIN
        DELETE FROM subcategories WHERE category_id = OLD.id;
    END;

이렇게 하면 다른 트리거도 제대로 작동할 수 있습니다.

도움이 되었으면 좋겠습니다.

언급URL : https://stackoverflow.com/questions/6041064/trigger-calls-in-cascade-deleting

반응형