2009-10-19 39 views

Trả lời

134

Bạn không thể làm điều đó chỉ với một lệnh MySQL duy nhất, tuy nhiên bạn có thể sử dụng MySQL để xây dựng báo cáo kết quả cho bạn:

Trong MySQL shell hoặc thông qua PHPMyAdmin, sử dụng truy vấn sau

SELECT CONCAT('DROP TABLE ', GROUP_CONCAT(table_name) , ';') 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%'; 

Điều này sẽ tạo ra một tuyên bố DROP mà bạn có thể sao chép và thực thi để thả các bảng.

EDIT: Tuyên bố từ chối trách nhiệm ở đây - tuyên bố được tạo ở trên sẽ xóa tất cả các bảng trong tất cả cơ sở dữ liệu với tiền tố đó. Nếu bạn muốn giới hạn nó vào một cơ sở dữ liệu cụ thể, sửa đổi các truy vấn để trông như thế này và thay thế database_name với database_name riêng bạn:

SELECT CONCAT('DROP TABLE ', GROUP_CONCAT(table_name) , ';') 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%'; 
+0

Tôi chỉ có một cơ sở dữ liệu vì vậy tôi sẽ không cần cơ sở dữ liệu thứ hai. –

+0

Cảm ơn! Vì vậy, vấn đề mà máy chủ MySQL của tôi là quá chậm. Cần 10-15 phút để thực thi kịch bản. Sau đó, nó mất quá nhiều thời gian để hiển thị toàn bộ kịch bản, rằng tôi đã dừng nó lại. Sẽ thử lại khi có thêm thời gian. –

+0

cách bỏ qua kiểm tra khóa ngoài? – Raptor

3

Bạn có thể làm điều đó trong một lệnh với MySQL:

drop table myprefix_1, myprefix_2, myprefix_3;

Bạn có lẽ sẽ phải xây dựng danh sách bảng động trong mã mặc dù.

Một cách tiếp cận thay thế sẽ được sử dụng general purpose routine library cho MySQL 5.

17
show tables like 'prefix_%'; 

bản sao kết quả và dán chúng vào một trình soạn thảo văn bản hoặc sản lượng truy vấn vào một tệp, sử dụng một vài tìm kiếm và thay thế để xóa định dạng không mong muốn và thay thế \n bằng dấu phẩy đặt ; ở cuối và thêm bảng thả xuống phía trước.

bạn sẽ nhận được cái gì đó trông như thế này:

drop table myprefix_1, myprefix_2, myprefix_3; 
+0

không có quyền truy cập vào information_schema.tables trên webhost mà tôi đang sử dụng, vì vậy đây là cách để cảm ơn! – Florent

10

@andre-miller giải pháp là tốt nhưng có thậm chí tốt hơn và hơi chuyên nghiệp hơn sẽ giúp bạn thực hiện tất cả trong một đi là. Vẫn sẽ cần nhiều lệnh nhưng giải pháp này sẽ cho phép bạn sử dụng SQL để xây dựng tự động.

SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) 
    FROM information_schema.TABLES 
    WHERE TABLE_NAME LIKE 'myprefix_%'); 
PREPARE stmt FROM 'DROP TABLE @tbls'; 
EXECUTE stmt USING @tbls; 
DEALLOCATE PREPARE stmt; 

Lưu ý: mã này phụ thuộc vào nền tảng, cho MySQL nhưng chắc chắn nó có thể được triển khai cho Postgre, Oracle và MS SQL với những thay đổi nhỏ.

+0

ERROR 1064 (42000): Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để có cú pháp đúng để sử dụng gần '@tbls' tại dòng 1 ERROR 1243 (HY000): Trình xử lý câu lệnh chưa được xử lý (stmt) cho EXECUTE ERROR 1243 (HY000): handler (stmt) được cung cấp cho DEALLOCATE PREPARE –

+0

Lỗi cú pháp tại: PREPARE stmt FROM 'DROP TABLE @tbls'; –

1
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables 
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%"; 
25

Một số câu trả lời trước đó rất tốt. Tôi đã tập hợp ý tưởng của mình với một số ý tưởng từ các câu trả lời khác trên web.

tôi cần phải xóa tất cả các bảng bắt đầu bằng 'temp_' Sau một vài lần lặp tôi đã đưa ra khối mã này:

-- Set up variable to delete ALL tables starting with 'temp_' 
SET GROUP_CONCAT_MAX_LEN=10000; 
SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) 
       FROM information_schema.TABLES 
       WHERE TABLE_SCHEMA = 'my_database' 
       AND TABLE_NAME LIKE 'temp_%'); 
SET @delStmt = CONCAT('DROP TABLE ', @tbls); 
-- SELECT @delStmt; 
PREPARE stmt FROM @delStmt; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

Tôi hy vọng điều này rất hữu ích cho các lập trình MySQL/PHP khác.

1

Tôi thấy rằng các báo cáo đã chuẩn bị là một chút khó khăn để có được làm việc cho tôi, nhưng thiết lập các GROUP_CONCAT_MAX_LEN là rất cần thiết khi bạn có rất nhiều bảng.Điều này dẫn đến một quá trình ba bước đơn giản với cắt và dán từ mysql dòng lệnh mà làm việc tuyệt vời cho tôi:

SET GROUP_CONCAT_MAX_LEN=10000; 
SELECT CONCAT('DROP TABLE ', GROUP_CONCAT(table_name) , ';') 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%'; 

Sau đó cắt-và-dán cẩn thận kết quả dài thả tuyên bố.

+0

kết thúc truy vấn bằng '\ G' thay vì'; 'cho đầu ra sạch hơn một chút –

1

Tôi chỉ muốn gửi các SQL chính xác tôi đã sử dụng - đó là một cái gì đó của một hỗn hợp của 3 câu trả lời đầu:

SET GROUP_CONCAT_MAX_LEN=10000; 

SET @del = (
    SELECT  CONCAT('DROP TABLE ', GROUP_CONCAT(TABLE_NAME), ';') 
    FROM  information_schema.TABLES 

    WHERE  TABLE_SCHEMA = 'database_name' 
    AND   TABLE_NAME LIKE 'prefix_%' 
); 

PREPARE stmt FROM @del; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
3

Tôi thả bảng thành công bởi chỉnh sửa truy vấn như thế này

SET GROUP_CONCAT_MAX_LEN=10000; 
SET FOREIGN_KEY_CHECKS = 0; 
SET @tbls = (SELECT GROUP_CONCAT(CONCAT('`', TABLE_NAME, '`')) 
      FROM information_schema.TABLES 
      WHERE TABLE_SCHEMA = 'pandora' 
      AND TABLE_NAME LIKE 'temp_%'); 
SET @delStmt = CONCAT('DROP TABLE ', @tbls); 
-- SELECT @delStmt; 
PREPARE stmt FROM @delStmt; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
SET FOREIGN_KEY_CHECKS = 1; 
+0

Đây là lần duy nhất tôi tìm thấy đã thực hiện toàn bộ thao tác trong một shebang trong khi giải quyết các ràng buộc khóa ngoài. –

0

Chỉ cần một giải pháp khác bằng cách sử dụng GROUP_CONCAT để nó sẽ thực hiện một truy vấn thả như
DROP TABLE table1, table2, ..

SET @Drop_Stm = CONCAT('DROP TABLE ', (
     SELECT GROUP_CONCAT(TABLE_NAME) AS All_Tables FROM information_schema.tables 
     WHERE TABLE_NAME LIKE 'prefix_%' AND TABLE_SCHEMA = 'database_name' 
)); 
PREPARE Stm FROM @Drop_Stm; 
EXECUTE Stm; 
DEALLOCATE PREPARE Stm; 
Các vấn đề liên quan