SQL: xóa bảng có tiền tố


Câu trả lời:


178

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

Trong MySQL shell hoặc thông qua PHPMyAdmin, hãy 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 câu lệnh DROP mà bạn có thể sao chép và thực thi để loại bỏ các bảng.

CHỈNH SỬA: Tuyên bố từ chối trách nhiệm ở đây - câu lệnh được tạo ở trên sẽ loại bỏ tất cả các bảng trong tất cả các cơ sở dữ liệu có tiền tố đó. Nếu bạn muốn giới hạn nó trong một cơ sở dữ liệu cụ thể, hãy sửa đổi truy vấn để trông giống như thế này và thay thế database_name bằng database_name của 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_%';

Tôi chỉ có một cơ sở dữ liệu nên tôi sẽ không cần cái thứ hai.
Deniz Zoeteman

4
@ElijahLynn nguồn giới hạn có thể là do độ dài tối đa GROUP_CONCAT. bạn có thể phóng to nó, xem ví dụ ở đây
Asaf David

7
Lưu ý cho bản thân.Tăng số lượng ký tự tối đa: SET SESSION group_concat_max_len = 999999999;
Mohammed Joraid

2
Xin lưu ý rằng, trong một số trường hợp, nó là cần thiết để thoát khỏi dấu gạch dưới trong tên tiền tố bảng[...] LIKE 'myprefix\_%';
Magictallguy

1
Điều này trả về nhiều tên_bảng trùng lặp. Câu trả lời mà Pankaj Khurana đã đăng hoạt động tốt hơn IMHO.
Jeremy,

37

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

Tôi cần xóa tất cả các bảng bắt đầu bằng 'temp_' Sau một vài lần lặp lại, tôi đã nghĩ 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 hữu ích cho các lập trình viên MySQL / PHP khác.


1
Đây chính xác là câu trả lời đúng. Các câu trả lời khác sử dụng nhiều bước hoặc yêu cầu thực hiện thủ công. Không biết câu trả lời này không có thêm lượt bình chọn sau 4 năm!
gbe 29/09/18

25
show tables like 'prefix_%';

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

bạn sẽ nhận được một cái gì đó giống như sau:

drop table myprefix_1, myprefix_2, myprefix_3;

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

10

@ andre-miller giải pháp là tốt nhưng còn có giải pháp tốt hơn và chuyên nghiệp hơn một chút sẽ giúp bạn thực hiện tất cả trong một lần. Vẫn sẽ cần nhiều hơn một lệnh nhưng giải pháp này sẽ cho phép bạn sử dụng SQL cho các bản 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, nó dành 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ỏ.


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

Lỗi cú pháp tại: CHUẨN BỊ stmt FROM 'DROP TABLE @tbls';
ledawg

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

3

Tôi thả bảng thành công bằng cách chỉnh sửa truy vấn để thích điều 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;

Đây là công cụ duy nhất tôi tìm thấy đã thực hiện toàn bộ hoạt động trong một tập trong khi giải quyết các ràng buộc khóa ngoại.
Evan Mattson

2

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

drop table myprefix_1, myprefix_2, myprefix_3;

Mặc dù vậy, có thể bạn sẽ phải tạo danh sách bảng động bằng mã.

Một cách tiếp cận thay thế sẽ là sử dụng thư viện quy trình mục đích chung cho MySQL 5.


2

Tôi chỉ muốn đăng câu SQL chính xác mà tôi đã sử dụng - đó là thứ hỗn hợp của 3 câu trả lời hàng đầ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;

2

Chỉ là một giải pháp khác sử dụng GROUP_CONCAT nên 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;

1

Tôi thấy rằng các câu lệnh đã chuẩn bị hơi khó để làm việc cho tôi nhưng việc thiết lập nó GROUP_CONCAT_MAX_LENlà điều cần thiết khi bạn có rất nhiều bảng. Điều này dẫn đến một quy trình ba bước đơn giản với việc cắt và dán từ dòng lệnh mysql rất hiệu quả đối với 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ẩn thận cắt và dán câu lệnh DROP dài thu được .


kết thúc truy vấn với \Gthay vì ;đưa ra một sản lượng ít bụi
Stuart Cardall
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.