2010-07-08 5 views
3

ID를 기반으로 1 개의 쿼리에서 두 개의 다른 테이블에있는 정보를 삭제하려고합니다.2 테이블에서 MySQL 삭제 레코드

이 작업을 수행하기 위해 여기에서 여러 가지 해결책을 시도했지만 아직 수행하려는 작업을 수행하지 못했습니다.

표 1 - 콘텐츠

---------- --------- 
ContentID | Content 
-------------------- 

표 2 - 투표 나는 그것의 ID 및 또는 모든 표를 기반으로 콘텐츠 행을 삭제할

--------------------------- 
VoteID | ContentID | Vote 
--------------------------- 

(이있을 수 있습니다 0 표 기록). do NOT 트랜잭션을 사용하거나 계단식으로 삭제하거나 두 가지 다른 쿼리를 사용하려고합니다.

가장 좋은 것은 무엇입니까 - 좌측 접합인가? 내부 가입?

여기에 도움을 주시면 매우 감사하겠습니다.

+0

는 [MySQL이 구문을 삭제] 참조 된 솔루션을 찾고있는 동안 가지고 올 수있다 "JOINS"유용 할 수 있습니다 (http://dev.mysql.com/doc/refman/5.1/en/delete.html) * 다중 테이블 DELETE *를 찾으십시오. – Mike

+0

MySQL은 다중 테이블 삭제를 지원하지만 표준 SQL은 명령문 당 하나의 테이블에서만 삭제를 허용합니다. 다른 데이터베이스로 이식 할 계획이라면 다시 작성해야합니다. –

답변

7
DELETE Content, Votes 
FROM Content 
LEFT JOIN Votes 
ON Votes.ContentID = Content.ContentID 
WHERE Content.ContentID = ? 
1
DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 
WHERE t1.id=t2.id AND t2.id=t3.id; 

3 개의 테이블에도 불구하고 사용자의 요구에 맞게 조정할 수 있습니다.

2

관계가있는 경우 ON DELETE CASCADE 옵션을 사용해보십시오.

또 다른 옵션은 저장 프로 시저를 만들고 2 단계지만 서버 호출을 하나만 사용하여 삭제하는 것입니다.

+2

나는 이것이 "트랜잭션을 사용하거나 삭제를 계단식으로 사용하지 않거나 2 개의 다른 쿼리를 사용하고 싶지 않다"라고 생각하지 않는다. – Mike

+0

우려가 단지 하나의 서버 만 가지고 있다면 아마도 저장된 절차 보호 부분 일 것이다. 요청 ... 나는 대답의 "requisites"부분을 건너 뛰는 것을 인정한다;) – munissor

1

DELETE 문에 여러 테이블을 지정하여 WHERE 절의 특정 조건에 따라 하나 이상의 테이블에서 행을 삭제할 수 있습니다. 그러나 다중 테이블 DELETE에서는 ORDER BY 또는 LIMIT를 사용할 수 없습니다. table_references 절은 조인과 관련된 테이블을 나열합니다. 구문은 12.2.7.1 절. "JOIN 구문"에서 설명합니다.

첫 번째 다중 테이블 DELETE 구문은 MySQL 4.0.0부터 지원됩니다. 두 번째 버전은 MySQL 4.0.2부터 지원됩니다.

첫 번째 다중 테이블 구문의 경우 FROM 절 앞에 나열된 테이블의 일치하는 행만 삭제됩니다. 두 번째 다중 테이블 구문의 경우 FROM 절 (USING 절 앞에 있음)에 나열된 테이블의 일치하는 행만 삭제됩니다. 결과는 동시에 많은 테이블에서 행을 삭제하고 검색에만 사용되는 추가 테이블을 가질 수 있다는 것입니다.

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id = t2. id AND t2.id = t3.id;

또는 :

INNER T1이 T2는 T3 INNER 참가를 이용한 T1, T2에서 삭제 WHERE t1.id = t2.id AND t2.id = t3.id;

이 문은 삭제할 행을 검색 할 때 세 개의 표를 모두 사용하지만 표 t1과 t2에서만 일치하는 행을 삭제합니다.

이 링크는 "http://dev.mysql.com/doc/refman/4.1/en/delete.html는"사용하지 않고

+0

그래서 WHERE 절이 무엇이겠습니까? contentId는 내용 표에 있지만 1 회 이상 투표 테이블에 존재할 수도 있고 존재하지 않을 수도 있습니다. – barfoon

+1

DELETE 내용, 투표 FROM 내용 INNER JOIN 투표 내용 : Content.ContentID = Votes.ContentID 및 "조건 적용" – user386660

+0

@dilipchouhan : 내부 조인은 투표에서 일치하는 행이 발견되지 않으면 내용 레코드가 삭제되지 않도록합니다. 그것은 왼쪽 조인이어야합니다 :'DELETE Content, Votes from FROM Content LEFT JOIN Votes.ContentID = Content.ContentID WHERE Content.ContentID =?' – Mike

0

은 단순한 나는 DELETE a.*,b.* FROM table1 AS a, table2 AS b WHERE a.id = b.id AND a.field = 1

관련 문제