2010-01-06 5 views
5

세 번째 테이블 ID를 기반으로 두 개의 종속 테이블에서 모든 행을 삭제하려고합니다.[MySQL] : 두 개의 종속 테이블에서 행을 삭제

테이블 구조는 :

Transaction 
-Transaction_ID (primary) 
-Timestamp 

Purchase 
-Item_ID 
-Transaction_ID 
-Purchase_ID (primary) 

Item 
-Item_ID (primary) 
-Client_ID 

나는 항목에서 CLIENT_ID 일치 거래/구매의 모든 행을 삭제하고 싶습니다. 심지어 내가 그 주위에 내 초보자의 마음을 포장 할 수 있습니다 ... 아주 간단 소리 ...

DELETE dbName.t FROM 
    dbName.Transaction t 
JOIN 
    dbName.Purchase p 
ON 
    p.Transaction_ID = t.Transaction_ID 
JOIN 
    dbName.Item i 
ON 
    p.Item_ID = i.Item_ID 
WHERE 
    Client_ID = 1 

아니 ...

내가이 오류 foreign key constraint fails...를 얻을 - 당신이 놀랄되지 않습니다의 많은 분들 해요.

구매시 t.Transaction_ID가 사용되는 문제입니까? - (따라서이 외래 키가 실패합니다.)

또는이 테이블에 다른 t.Transaction_ID 종속 데이터가있을 가능성이 있습니다 (발견되지 않았습니다).

편집 : COMPLETE ERROR

Cannot delete or update a parent row: a foreign key constraint fails 
(`ItemTracker_dbo/Purchase`, CONSTRAINT `FK_Purchase_Transaction` 
FOREIGN KEY (`Transaction_ID`) REFERENCES `Transaction` (`Transaction_ID`) 
ON DELETE NO ACTION ON UPDATE CASCADE) 

답변

4
을에 DELETE CASCADE ON 를 거꾸로을하거나 설정할 필요가있다

종속 레코드가 다른 테이블에 계속 존재하는 한 테이블에서 삭제할 수 없습니다. 귀하의 경우 종속성은 다음과 같습니다.

Transaction <- Purchase -> Item 

따라서 트랜잭션을 삭제하려면 먼저 구매를 삭제해야합니다. 이 두 단계 접근 방식에 대한 대안으로

는, 나는 ON DELETE CASCADE constraint을 설정하는 것이 좋습니다이 함께 갈 것 :이 삭제 조심하십시오

DELETE 
    Transaction 
WHERE 
    Transaction_ID IN (
    SELECT 
     Transaction_ID 
    FROM 
     Purchase INNER JOIN Item ON Item.Item_ID = Purchase.Item_ID 
    WHERE 
     Item.Client_ID = <your Client ID here> 
) 

(CASCADE 통해, 어떤 Purchase) 어떤 Transaction이 어떤 다른 항목이 있는지 여부에 관계없이 Client_ID과 일치하는 종속 Item입니다. 이것이 당신이 원하는 것이 아니라면, 질문을 세련시켜야합니다.

+0

내게 반대로 보인다 - 거래는 구매에 달려있다. (나는 client_id가 없으면 그것을 쓸 수 없다) –

+0

@Derek Adair : @AlbertEin이 처음으로 질문에 올바르게 대답 한 이래로 나의 포스트는 크게 보완해야했다. 도움이되기 전에 그의 대답을 수락하는 것을 고려하십시오. – Tomalak

+0

신중하게 검토하지 않으면 구매 테이블에 Transaction_ID가 있습니다. 먼저 트랜잭션을 삭제하면 구매 테이블에 존재하지 않는 유효하지 않은 Transaction_ID가 일시적으로 포함됩니다. – MindStalker

2
Transaction <- Purchase -> Item 

귀하의 문제는 당신이 것을 구입, 그것은 구입 만 다음 트랜잭션을 삭제됩니다 할 수있는 올바른 방법을 삭제하기 전에 트랜잭션을 삭제하려고하는 것입니다 또는 외래 키에 ON DELETE CASCADE을 사용할 수 있습니다. ON DELETE RESTRICT을 사용하고있는 것으로 보입니다.

는 여기를 참조하십시오 : http://dev.mysql.com/doc/refman/5.0/es/innodb-foreign-key-constraints.html

을 게다가, 당신이 당신이 완전한 오류를 제공해야하는 이유는 DBMS는 일반적으로 외래 키 위반 오류를 제기 무엇을 알려줍니다 확인하기 위해 wan't합니다.

UPDATE : 당신의 오류는 분명히이 문제는 먼저 구매를 삭제 한 후 트랜잭션, 당신이 당신의 외래 키 제약 조건

+0

내 대답 아래의 의견은 이제 빨간색 청어입니다. 우리가 그들을 삭제해야합니까? – Tomalak

+0

저에게 아무런 문제가 없습니다. 그래서, 당신이 그들을 삭제하면 나는 그들을 삭제할 것입니다;) – albertein

+0

좋아, 지금 삭제. 우리가 끝나면 당신의 답변에 대한 추천을 게시 할 것입니다. – Tomalak