캐스케이드 삭제 시 호출 트리거
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의 답변을 요약하면 다음과 같습니다.
- 안타깝게도 계단식 삭제는 MySQL에서 트리거를 활성화하지 않습니다.
- 한 가지 해결책은 계단식 삭제를 사용하지 않고 다른 트리거를 통해 자동 삭제를 구현하는 것입니다.
이 문제가 존재한다는 것을 처음 발견한 날부터 제가 어떻게 이 문제를 "고치고" 있는지 공유하겠습니다.계단식 테이블에서 트리거를 직접 삭제된 첫 번째 테이블로 복사합니다.그냥 되는 거지.
복사/붙여넣기의 문제가 되는 경우가 많으며, 때로는 코드를 광범위하게 다시 작성해야 하는 경우도 있습니다.
가장 좋은 점은 오라클이 이 버그를 최종적으로 수정할 때 해당 테이블에서 트리거 코드만 제거하면 된다는 것입니다.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
'programing' 카테고리의 다른 글
파워셸 ps1 파일은 "cmdlet, 함수, 작동 가능한 프로그램 또는 스크립트 파일로 인식되지 않습니다." (0) | 2023.10.05 |
---|---|
정지된 도커 컨테이너만 나열합니다. (0) | 2023.10.05 |
Mysql 피복 대 합성 대 열 인덱스 (0) | 2023.10.05 |
jQuery에서 $(이) 선택된 옵션을 얻는 방법은? (0) | 2023.10.05 |
메이븐: 컴파일할 소스가 없습니다. (0) | 2023.09.25 |