2009-09-04 6 views
9

많은 이상 삭제 계단식 방법 : 계단식 삭제 내가 설정 한 외부 키에 I는 다음과 같이 3 테이블이 여러 테이블

합니다. 지금 Folder 테이블의 레코드를 삭제하면 FolderItem의 관련 레코드 만 삭제됩니다.

이것은 정확하고 정확합니다.

폴더 테이블의 레코드를 삭제하면 FolderItem 및 Item 테이블의 해당 레코드가 삭제됩니다.

어떻게 해결할 수 있습니까? 해당 FolderID를 가진 Item의 모든 인스턴스를 삭제하는 트리거를 추가 하시겠습니까? 더 좋은 해결책이 있습니까?

답변

10

시스템에서 원하는 동작을 결정해야합니다. 요구 사항이 약간 이상하게 들리며 db 스키마 디자인에서 실수를 나타낼 수 있습니다. 관련 폴더를 삭제할 때 왜 항목을 삭제 하시겠습니까? 그것이 다 - 대 - 다 관계이기 때문에 그 아이템과 관련된 다른 폴더가 있다면? 이 경우 Item을 삭제하면 실제로 Item과 FolderItem간에 외래 키 위반이 발생합니다. Items가 실제로 특정 Folder, 일명 대 다수 관계로 속하는 경우에는 FolderItem 테이블이 전혀 필요하지 않습니다.

다른 FolderItem 항목이 없다면 항목을 삭제하려고 할 가능성이 높습니다. 이 경우 트리거가 적절한 솔루션이지만 트리거 논리에서 트리거를 확인해야합니다.

+0

예, 맞습니다. 조금 이상합니다. 그리고 나는 당신이 두 번째 단락에서 설명했던 것과 같은 원하는 행동을 명확히해야만했습니다. –

1

폴더 항목과 항목 사이의 FK에도 캐스케이드 삭제 기능이 설정되어 있어야합니다.

업데이트 :
귀하의 의견과 그 대안을 읽었습니다. 당연히 올바르게 - 나는 당신의 질문을 올바르게 읽을 수 없었습니다. 단순한 1 대 다인 관계를 가정하면 옳을 것이다. 그러나 많은 것을 가지고 그렇게 간단하지는 않다. 트리거 (또는 더 나은 여전히, 귀하의 코드에서 일부 비즈니스 로직)는 당신이 원하는 것을 얻기위한 최선의 방법입니다.

+0

이미 있습니다. 하지만 해당 항목을 계단식으로 삭제하지는 않습니다. 한길 답을보세요. –

-1

m과 m의 관계가있는 경우 folderitem이 다른 코스에도 연관 될 수 있기 때문에 Folteritem 레코드를 삭제할 수 없습니다. 그래서, 폴더 레코드에서 u를 삭제하면 관련 폴더 항목이 아닌 관계 만 삭제해야합니다. 모든 폴더 항목이 하나의 폴더에만 관련 될 수 있으면 일대 다 관계를 사용하고 folderitem fk (폴더의 fk -> pk)에서 계단식을 설정해야합니다.

관련 문제