2010-03-02 6 views
3

groupID를 선택하고 MS SQL 서버 데이터베이스에서 찾을 수있는 세 개의 테이블을 통해 계단식 삭제를 수행 할 수 있기를 원합니다. 표는 다음과 같다 다음 : 나는이 그룹 ID를 알고 있기 때문에, 나는 아마도 그룹 ID의 기반으로 매핑 테이블에서 MEMBERID의의를 선택하고 회원 테이블에서 사람들을 삭제,하지만 난 수 있다는 생각 해요외래 키가있는 세 테이블에서 어떻게 삭제할 수 있습니까?

table 1 - GROUP 
------------------------------------------- 
groupID | description | etc 


table 2 - MEMBER 
------------------------------------------- 
memberID | name | etc 


table 3 - MAPPINGTABLE 
------------------------------------------- 
mappingID | groupID | memberID 

을 일반적으로 다음과 같은 오류로 끝납니다 :

"DELETE 문이 REFERENCE 제약 조건 [표의 FK 제약 조건]과 충돌했습니다."

누가 나에게 세 테이블을 동시에 삭제할 수있는 가장 좋은 방법에 대한 지침을 줄 수 있습니까?

감사합니다.

+1

다른 데이터베이스를 사용하십니까? – RRUZ

+0

죄송합니다. MS SQL Server 2005. – Chris

답변

5

로 실행됩니다. 참조 무결성. 걱정할 필요가 없습니다. RI는 당신의 친구입니다. 그것은 당신을 보호하기위한 것입니다. 삭제하려는 행이 MappingTable에 대응하는 행이있는 경우

은 구조를 기반으로, 당신은 회원 또는 그룹 테이블에서 삭제할 수 없습니다.

시스템에서 허용하는 경우, 회원 테이블이나 그룹 테이블에 해당 데이터가없는 매핑 테이블에 고아 데이터가 있습니다. 외부 키 제한 조건을 사용하여 데이터에 참조 무결성 제약 조건이 설정되었으므로 데이터베이스에서 데이터를 삭제하지 못하게합니다.

ON DELETE CASCADE과 같은 옵션이 있지만 매우 치명적일 수 있으며 대량의 데이터 손실을 유발할 수 있습니다. 개인적으로 계단식 삭제를 구현하지 않습니다.

먼저 MappingTable에서 행을 제거하고 조회 테이블에서 모든 데이터 (회원 그룹)

나는 다음과 같은 말을해야했다 가졌 삭제해야합니다 :

  1. 만들기를 데이터를 삭제하기 전에 데이터를 백업합니다 (유효한 백업인지 확인하십시오).
  2. 삭제 된 다른 백업 원인 데이터를 삭제하면 영원히 사라집니다. 사업/중소기업과
  3. 확인은 데이터를 제거하여 당신이 옳은 일을하고 있다는 것을 확인하는
  4. 당신은 다시 테이블 위로 당신의 방식으로 작동하기 때문에 매우 하단에 시작하고 테이블에서 삭제해야
+0

동의 누군가 삭제가 많은 레코드 일괄 처리 일 경우 대용량 성능 문제가 발생할 수 있으므로 계단식 삭제는 절대로 사용하지 마십시오. – HLGEM

+0

데이터는 삭제해도 안전합니다. 사용자가 실제로 다른 테이블에 저장하기 전까지는 모든 임시 작업이 필요합니다. – Chris

+0

고마워요! 오늘 아침에 약간의 토론에서 주스가 나왔습니다. 임시 테이블을 사용하여 맵핑 테이블에서 삭제 한 다음 수정 된 ID를 보유한 다음 매핑 행을 삭제 한 후 다른 두 테이블에서 삭제했습니다. – Chris

3

3 테이블 1로 돌아갑니다.

0

계단식 삭제는 다른 SQL 서버에서 다르게 구현됩니다. 서버 소프트웨어에 대해 무엇을 사용하고 있습니까?

oracle에서 테이블을 작성할 때 계단식 삭제를 지정하여 기본 레코드가 삭제 될 때 다른 테이블의 데이터를 자동으로 삭제할 수 있습니다.다음은 예입니다 :

ALTER TABLE MAPPINGTABLE ADD CONSTRAINT FK_GROUPID 
    FOREIGN KEY (groupID) REFERENCES GROUP(groupID) 
ON DELETE CASCADE 
; 
0

가장 쉬운 것은 당신이 당신의 외래 키를 설정하는 경우, 당신은 당신이 그것을 추가하고자한다면 다른 옵션은 ON UPDATE CASCADE입니다 ON DELETE CASCADE

ALTER TABLE mappingtable ADD CONSTRAINT fk_group_id FOREIGN KEY(groupID) REFERENCES group(groupID) ON DELETE CASCADE 

로 설정되어 있지만 여기서는 도움이되지 않습니다.

이는 두 번째 삭제 당신이 할 필요가있을 것이다, 그것은 자동으로 MAPPINGTABLE

사용자에서 삭제하려면 표에서 모든 참조를 삭제됩니다 GROUP에서 부모를 삭제할 때 그렇게 만드는 것입니다 무엇을 성명서.

+0

계단식 삭제를 사용하여 매우 신중해야합니다 ... 결코 두려움에서 그들을 사용하지 마십시오. –

+0

계단식 삭제는 친구입니다. –

+0

'ON DELETE CASCADE'는 불 같이 - 큰 유익이나 큰 피해를 줄 수있는 도구입니다. 오라클의 DELETE CASCADE 구현은 기능적으로 중첩 루프 삭제입니다 (각 행에 대해 DELETE FROM CHILD_TABLE WHERE KEY_VALUE = : parent_key를 발행합니다). 어떤 경우에는 DELETE로 자식을 찾는 것이 더 나을 것입니다 FROM CHILD_TABLE WHERE DELETE_CONDITION가 TRUE 인 PARENT_KEY로부터 SELECT KEY_VALUE가 발생합니다. –

1

캐스케이드 삭제를 사용하려면 외래 키에서 삭제 규칙을 지정해야합니다. "ON DELETE CASCADE"옵션이 필요합니다.

이 예를

CREATE TABLE table_child 
(
fieldkeyparent int, 
field1 INT, 
FOREIGN KEY ([fieldkeyparent]) REFERENCES Table_parent 
ON DELETE CASCADE) 

검사 SQL Server에 대한 링크를 참조하십시오. Cascading Referential Integrity Constraints

+0

아이디어를 제공해 주셔서 감사합니다. 당신의 create table은 저에게 다른 테이블에서 삭제하는 동안 어떤 값을 유지할 임시 테이블을 생성하는 아이디어를주었습니다. – Chris

관련 문제