카테고리 없음

[mysql] ON DELETE CASCADE — 두 개 이상의 외래 키 필요

행복을전해요 2021. 2. 8. 07:40

ON DELETE CASCADE가 원하는 것을 얻을 수 있다고 생각하지 않습니다. 그것은 일을 더 쉽게 만들 것이지만, 거기까지 가려면 방아쇠를 사용해야 할 것입니다. 사용자, 스레드 및 이들 간의 매핑에 대한 다음과 같은 간단한 테이블 설정을 고려하십시오.

CREATE TABLE users (id int, user_name varchar(50))

CREATE TABLE threads (id int, content varchar(max))

CREATE TABLE users_to_threads (
   user_id int, 
      thread_id int,
         CONSTRAINT FK_U FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
            CONSTARINT FK_T FOREIGN KEY (thread_id) REFERENCES threads(id) ON DELETE CASCADE
            )
            

이제 사용자가 삭제 될 때마다 매핑도 손상됩니다. 그런 다음 트리거를 사용하여 스레드를 삭제해야하는지 확인합니다 (AFTER 트리거가 실행되기 전에 계단식 삭제가 발생한다고 확신합니다.이 솔루션이 여전히 작동하지 않으면 약간의 수정이 필요합니다) :

http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

CREATE TRIGGER user_cleanup AFTER DELETE ON users FOR EACH ROW BEGIN
   DELETE threads WHERE id NOT IN 
         (SELECT DISTINCT thread_id FROM users_to_threads)
         END
         

이를 수행하기 위해 더 효율적인 쿼리를 작성할 수 있지만 일반적인 아이디어를 얻을 수 있습니다. 영리 해지지 않고 매핑 테이블에 트리거를 넣은 다음 '사용자'의 계단식 삭제에 의해 실행되는 것에 의존 수 없습니다 . MySql은이를 지원하지 않으며 곧 수정할 계획 인 것처럼 보이지 않습니다. http://bugs.mysql.com/bug.php?id=11472 MariaDB에 대한 수정 사항이 있는지 확실하지 않습니다. 저는 SQL Server 전문가입니다.



출처
https://stackoverflow.com/questions/22050287