2011-05-04 3 views
2

상위 레코드와 하위 레코드를 저장하는 테이블이 있습니다.MySql은 동일한 테이블의 하위 레코드를 삭제합니다.

내가 부모가 삭제 될 때 모든 자식 레코드를 삭제할 것 트리거를 만들려고했다 :

Delete From tbl Where ParentId = OLD.Id 

을 나는 성공적으로 방아쇠를 저장할 수 있지만를,이 오류가 얻을 삭제하는 경우 :

ERROR 1442: Can’t update table ‘tbl′ in stored function/trigger because it is already used by statement which invoked this

내가 뭘 잘못하고 있니?

답변

6

not possible 것으로 나타납니다

You cannot DELETE rows in the table that activated trigger.

당신에 대해 생각하는 몇 가지 다른 옵션 : 부모와 자식 행을 삭제

  1. 쓰기 애플리케이션 로직, 때마다 당신이 응용 프로그램의 로직을 호출 상위 레코드를 직접 삭제하는 대신 삭제하려고합니다.
  2. 동일한 테이블에서 계단식 삭제 관계입니다 (appears to be possible).
  3. 고아 상태 인 하위 레코드를 정기적으로 지우는 정리 프로세스입니다.
  4. (@Chris에서 제안) 다른 테이블을 추가하여 상위 레코드에서 하위 레코드를 분리합니다.
+1

또는 4. 다른 테이블을 추가하여 상위 레코드에서 하위 레코드를 분리하십시오. 내 경우에는 –

+0

4 옵션이 아닙니다. 당신의 제 2의 제안은 저를 위해 잘 작동했습니다. 같은 테이블에서 할 수 있다는 것을 몰랐습니다. 감사! – IgalSt

0

s. 동일한 테이블에서 하위 레코드의 Delete Cascade을 수행 할 수 있습니다. 나는 대답을 찾았다 this post in the MYSQL forums가 있었다. 내가 일하는 방법은 다음과 같습니다.

  1. 기본 ID의 부모가 NULL로 설정되었는지 확인해야했습니다.
  2. 기본 ID와 상위 ID가 INT와 같은 종류의 필드로 정확하게 설정되었는지 확인해야했습니다.
  3. 또한 기본 ID가 자동 증가로 설정되어 있는지 확인해야했습니다. 이제

    create table edges(
        ID int PRIMARY KEY, 
        parentid int, 
        unique key(id, parentid), 
        foreign key(parentID) references edges(ID) ON DELETE CASCADE ON UPDATE CASCADE 
    ) engine=innodb; 
    
    insert into edges(ID,parentID) values (1,null),(2,1),(3,1),(4,2); 
    

    이렇게 부모를보고 모든 아이들이 계단식 삭제 :

    delete from edges where id=2; 
    
    select * from edges will then show two records left. Record 1 and record 3. 
    

    이 내 프로젝트, 갤러리 사용자 수에 대한 거대한했다 MYSQL 포럼에서

앨범 안의 앨범 안에 앨범을 만듭니다.

관련 문제