2009-04-09 42 views
7

Tôi đang cố gắng sử dụng SQL để xóa nhiều hàng từ nhiều bảng được kết hợp với nhau.xóa các hàng khỏi nhiều bảng

Bảng A được gia nhập vào Bảng B Bảng B được gia nhập vào Bảng C

Tôi muốn xóa tất cả các hàng trong bảng B & C tương ứng với một hàng trong Bảng A

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`) 
); 

Trả lời

18

Vâng, nếu bạn đã sử dụng các bảng InnoDB, bạn có thể thiết lập một cascading delete with foreign keys rằng sẽ làm điều đó tất cả tự động. Nhưng nếu bạn có một số lý do cho việc sử dụng MyISAM, Bạn chỉ cần sử dụng một 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

Tại sao "SỬ DỤNG" chứ không phải "BẬT"? – pingu

+0

+1 tại đây nhờ .. – nickanor

+0

nếu bảng có hơn 50 triệu bản ghi thì sao? – vikram

2

Bạn có thể hoặc là chỉ cần kiểm tra sự hiện diện

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

nhưng điều này sẽ chỉ có ý nghĩa nếu hành vi này nên không phải lúc nào áp dụng . Khi hành vi nên luôn luôn áp dụng, thực hiện các phím nước ngoài với delete trên thác

giải thích trên trang web zillion, trong helpfiles của bạn và here

1

Xóa hàng từ nhiều bảng có thể được thực hiện theo hai cách:

  • Xóa các hàng khỏi một bảng, xác định các hàng cần xóa bằng cách tham chiếu đến một số khác bảng
  • Xóa các hàng từ nhiều bảng với một câu lệnh đơn

Có thể viết nhiều bảng DELETE bằng hai định dạng. Ví dụ sau đây cho thấy một cú pháp, đối với một truy vấn mà xóa các hàng từ một t1 bàn nơi các giá trị id phù hợp với những người trong một t2 bảng:

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

Cú pháp thứ hai là hơi khác nhau:

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

Để xóa các bản ghi phù hợp từ hai bảng, báo cáo bao gồm:

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

các ORDER bY và LIMIT khoản thường được hỗ trợ bởi UPDATE và dELETE không được phép khi các báo cáo được sử dụng cho các hoạt động nhiều bảng.

Các vấn đề liên quan