Làm cách nào để xóa các bảng của tôi có tiền tố myprefix_
?
Lưu ý: cần thực thi nó trong phpMyAdmin
Làm cách nào để xóa các bảng của tôi có tiền tố myprefix_
?
Lưu ý: cần thực thi nó trong phpMyAdmin
Câu trả lời:
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_%';
[...] LIKE 'myprefix\_%';
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.
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ế \n
bằ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;
@ 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ỏ.
SELECT CONCAT("DROP TABLE ", table_name, ";")
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME"
AND table_name LIKE "PREFIX_TABLE_NAME%";
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;
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.
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;
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;
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_LEN
là đ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 .
\G
thay vì ;
đưa ra một sản lượng ít bụi