2009-04-09 6 views
7

여러 테이블에서 여러 행을 삭제하려면 SQL을 사용하려고합니다.여러 테이블에서 행을 삭제

표 A 표 B 표 B에 가입은

내가 테이블 B에서

테이블의 행에
CREATE TABLE `boards` (
    `boardid` int(2) NOT NULL AUTO_INCREMENT, 
    `boardname` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`boardid`) 
); 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `messages` 
-- 

CREATE TABLE `messages` (
    `messageid` int(6) NOT NULL AUTO_INCREMENT, 
    `boardid` int(2) NOT NULL DEFAULT '0', 
    `topicid` int(4) NOT NULL DEFAULT '0', 
    `message` text NOT NULL, 
    `author` varchar(255) NOT NULL DEFAULT '', 
    `date` datetime DEFAULT NULL, 
    PRIMARY KEY (`messageid`) 
); 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `topics` 
-- 

CREATE TABLE `topics` (
    `topicid` int(4) NOT NULL AUTO_INCREMENT, 
    `boardid` int(2) NOT NULL DEFAULT '0', 
    `topicname` varchar(255) NOT NULL DEFAULT '', 
    `author` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`topicid`) 
); 

답변

18

음 :

여기를보세요. 당신의 MyISAM을 사용하는 몇 가지 이유가있는 경우에, 당신은 사용하십시오 multiple-table DELETE :

DELETE FROM boards, topics, messages 
USING boards INNER JOIN topics INNER JOIN messages 
WHERE boards.boardid = $boardid 
    AND topics.boardid = boards.boardid 
    AND messages.boardid = boards.boardid; 
+0

왜 "사용"하고 "사용하지 않는"이유가 무엇입니까? – pingu

+0

+1 여기에 감사합니다 .. – nickanor

+0

테이블에 50M 개가 넘는 레코드가 있다면 어떻게해야합니까? – vikram

2

당신은 어느 단지 존재

delete from topics where boardid in (select boardid from boards) 
delete from messages where boardid in (select boardid from boards) 

를 확인할 수 있지만,이 동작은 항상 적용되지해야하는 경우이는 감각을 만들 것 . 행동이 항상 적용해야 할 때, 캐스케이드에 삭제와 외부 키를 구현

은 도움말 번역시 아래와 같은에서, 엄청나게 많은 사이트에 설명하고 여러 테이블 here

1

삭제 행은 두 가지 방법으로 수행 할 수 있습니다

  • 한 테이블에서 행을 삭제하여 다른 행을 참조하여 삭제할 행을 결정하십시오. 테이블
  • 단일 테이블로 여러 테이블의 행을 삭제하십시오.

여러 테이블 DELETE 문은 두 가지 형식으로 작성할 수 있습니다. 다음 예는 ID 값 테이블 (T2)에서와 일치 테이블 T1로부터 행을 삭제하는 쿼리를 들어, 하나의 신택스를 보여

DELETE t1 FROM t1, t2 WHERE t1.id = t2.id; 

번째 구문은 약간 다르다 님

DELETE FROM t1 USING t1, t2 WHERE t1.id = t2.id; 

두 테이블에서 일치하는 레코드를 삭제, 문은 다음과 같습니다

DELETE t1, t2 FROM t1, t2 WHERE t1.id = t2.id; 
DELETE FROM t1, t2 USING t1, t2 WHERE t1.id = t2.id; 

순서에와 LIMIT 절은 일반적으로 업데이트에서 지원 때이 문을 사용할 수 없습니다 DELETE 다중 테이블 조작에 사용됩니다.

관련 문제