2012-10-28 30 views
5

Tôi có một loạt các bảng trong cơ sở dữ liệu MySQL, một số bắt đầu bằng phpbb_ * mà tôi muốn xóa tất cả chúng. Có ai đó biết cách làm như vậy thay vì làmthả bảng bằng cách sử dụng regex - MySQL

drop table <tablename>; 

mỗi lần? Giống như một regex?

drop table phpbb* 

hoặc cái gì đó như thế nào?

+1

Có thể kiểm tra bài đăng này: http://stackoverflow.com/questions/1589278/sql-deleting-tables-with-prefix –

Trả lời

7

Bạn có thể sử dụng thủ tục này MySQL:

DELIMITER $$ 
CREATE PROCEDURE drop_tables_like(pattern VARCHAR(255), db VARCHAR(255)) 
BEGIN 
    SELECT @str_sql:=CONCAT('drop table ', GROUP_CONCAT(table_name)) 
    FROM information_schema.tables 
    WHERE table_schema=db AND table_name LIKE pattern; 

    PREPARE stmt from @str_sql; 
    EXECUTE stmt; 
    DROP prepare stmt; 
END$$ 

DELIMITER ; 

Đối thả tất cả các bảng bắt đầu với 'a' trong cơ sở dữ liệu 'test1' bạn có thể chạy:

CALL drop_tables_like('a%', 'test1'); 

tham khảo: http://dev.mysql.com/doc/refman/5.5/en/drop-table.html

0

Chỉ cần thêm vào câu trả lời ở trên, MYSQL trả về lỗi ERROR 1046 (3D000): No database selected nếu không có cơ sở dữ liệu nào được chọn trước khi bắt đầu thủ tục. Vì vậy, hãy thêm vào câu lệnh này use <<db_name>>; vào câu trả lời ở trên. Giải pháp đã sửa đổi sẽ là:

use <<db_name>>;  
DELIMITER $$ 
CREATE PROCEDURE drop_tables_like(pattern VARCHAR(255), db VARCHAR(255)) 
BEGIN 
    SELECT @str_sql:=CONCAT('drop table ', GROUP_CONCAT(table_name)) 
    FROM information_schema.tables 
    WHERE table_schema=db AND table_name LIKE pattern; 

    PREPARE stmt from @str_sql; 
    EXECUTE stmt; 
    DROP prepare stmt; 
END$$  
DELIMITER ; 
CALL drop_tables_like('a%', '<<db_name>>'); 

Đảm bảo bạn thay thế <> bằng tên thực tế của cơ sở dữ liệu. Chúc mừng!

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