MySQL: DROP TABLE Bắt đầu với tiền tố


8

VÍ DỤ: Tôi có hơn 30 bảng bắt đầu bằng tiền tố "dp_" và khoảng 12 bảng bắt đầu bằng "ex_".

HỎI: Làm cách nào tôi có thể thả tất cả các bảng bắt đầu "dp_" trong một truy vấn?


Tôi đã cập nhật câu trả lời của mình để thực hiện việc thả các bảng mà không sử dụng thủ tục được lưu trữ. Hãy thử một lần !!!
RolandoMySQLDBA

Câu trả lời:


11

Đây là một thủ tục được lưu trữ chấp nhận Chuỗi cơ sở dữ liệu và tiền tố làm tham số:

DELIMITER $$

DROP PROCEDURE DropTablesWithPrefix $$
CREATE PROCEDURE DropTablesWithPrefix(db VARCHAR(64),prfx VARCHAR(20))
StoredProcedure:BEGIN
    DECLARE ndx,maxidx INT;
    DECLARE giventable,SQLSTMT VARCHAR(500);

    CREATE TABLE TableZapList
    (
        droptablesql VARCHAR(512),
        idx INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    ) ENGINE=MyISAM;

    INSERT INTO TableZapList (droptablesql)
    SELECT CONCAT('DROP TABLE ',table_schema,'.',table_name)
    FROM information_schema.tables
    WHERE table_schema = db AND SUBSTR(table_name,LENGTH(prfx)) = prfx;
    SELECT COUNT(1) INTO maxid FROM TableZapList;

    IF maxid = 0 THEN
        LEAVE StoredProcedure;
    END IF;<BR>

    SET ndx = 0;
    WHILE ndx < maxid DO
        SET ndx = ndx + 1;
        SELECT droptablesql INTO SQLSTMT FROM TableZapList WHERE idx = ndx;
        SET @sql = SQLSTMT;
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END WHILE;<BR>

    SELECT droptablesql FROM TableZapList;
    DROP TABLE TableZapList;
END;

DELIMITER ;

CẬP NHẬT 2011/07/12 14:55 EDT

Tôi chỉ nghĩ về một cách đơn giản hơn. Thay vì sử dụng một thủ tục được lưu trữ, chỉ cần sử dụng hàm GROUP_CONCAT để thu thập tất cả các bảng thành zap. Sau đó, soạn thành một truy vấn duy nhất:

Đây là một truy vấn để loại bỏ tất cả các bảng bắt đầu bằng wp_pol trong cơ sở dữ liệu hiện tại:

SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';')
FROM information_schema.tables
WHERE table_schema=database()
AND table_name like 'wp_pol%';

Điều tiếp theo cần làm là lưu trữ kết quả của nó trong

SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';')
INTO @dropcmd
FROM information_schema.tables
WHERE table_schema=database()
AND table_name like 'wp_pol%';

Điều cuối cùng là thực thi SQL động bằng cách sử dụng ba (3) lệnh sau:

PREPARE s1 FROM @dropcmd;
EXECUTE s1;
DEALLOCATE PREPARE s1;

Dưới đây là một bản trình diễn sử dụng MySQL 5.5.12 trong Windows hoạt động:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.5.12 MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

MySQL (Current test) :: use garbage
Database changed
MySQL (Current garbage) :: show tables;
+------------------------------+
| Tables_in_garbage            |
+------------------------------+
| datas                        |
| rolando                      |
| wp_commentmeta               |
| wp_comments                  |
| wp_contact_form_7            |
| wp_links                     |
| wp_most_read_hits            |
| wp_options                   |
| wp_pollsa                    |
| wp_pollsip                   |
| wp_pollsq                    |
| wp_postmeta                  |
| wp_posts                     |
| wp_posts_idtracker           |
| wp_tantan_wordpress_s3_cache |
| wp_term_relationships        |
| wp_term_taxonomy             |
| wp_terms                     |
| wp_usermeta                  |
| wp_users                     |
| wp_w3tc_cdn_queue            |
+------------------------------+
21 rows in set (0.00 sec)

MySQL (Current garbage) :: SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';') INTO @dropcmd FROM information_schema.tables WHERE table_schema=database() AND table_name like 'wp_pol%';
Query OK, 1 row affected (0.00 sec)

MySQL (Current garbage) :: SELECT @dropcmd;
+--------------------------------------------------------------------+
| @dropcmd                                                           |
+--------------------------------------------------------------------+
| DROP TABLE garbage.wp_pollsa,garbage.wp_pollsip,garbage.wp_pollsq; |
+--------------------------------------------------------------------+
1 row in set (0.00 sec)

MySQL (Current garbage) :: PREPARE s1 FROM @dropcmd; EXECUTE s1; DEALLOCATE PREPARE s1;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

Query OK, 0 rows affected (0.01 sec)

Query OK, 0 rows affected (0.00 sec)

MySQL (Current garbage) :: show tables;
+------------------------------+
| Tables_in_garbage            |
+------------------------------+
| datas                        |
| rolando                      |
| wp_commentmeta               |
| wp_comments                  |
| wp_contact_form_7            |
| wp_links                     |
| wp_most_read_hits            |
| wp_options                   |
| wp_postmeta                  |
| wp_posts                     |
| wp_posts_idtracker           |
| wp_tantan_wordpress_s3_cache |
| wp_term_relationships        |
| wp_term_taxonomy             |
| wp_terms                     |
| wp_usermeta                  |
| wp_users                     |
| wp_w3tc_cdn_queue            |
+------------------------------+
18 rows in set (0.00 sec)

MySQL (Current garbage) ::

Hãy thử một lần !!!


Tập lệnh Rolandos hoạt động nhưng người ta có thể cần tăng tham số group_concat_max_len nếu bạn có nhiều bảng hoặc tên bảng rất dài: SET SESSION group_concat_max_len = 1000000;
JohnP

Thay vì thay đổi nhóm + concat_max_len, tôi đã sử dụng truy vấn con có giới hạn và thực hiện các bước trong các bước
pedromanoel

Điều SUBSTRkiện trong INSERTnên là: SUBSTR(table_name, 1, LENGTH(prfx)) = prfxsau đó nó hoạt động tốt.
nguyệt quế

8

Đầu tiên, tạo một tập lệnh để thực hiện việc này tại dấu nhắc Unix:

$  echo "select concat('drop table ', table_name, ';') from information_schema.tables where table_name like 'prefix_%';" |mysql --user=root --password=blah --batch >drop.sql

Thay thế tiền tố bằng của riêng bạn. Các --batchtùy chọn ngăn chặn sự ưa thích định dạng MySQL thực hiện theo mặc định, do đó bạn có thể tạo ra một kịch bản SQL Runnable.

Xem lại tập lệnh và nếu nó ổn, hãy chạy drop.sqltại mysql>dấu nhắc.


Tôi đã hoàn thành một kịch bản trợ giúp php để làm điều này, tuy nhiên tôi đã tự hỏi liệu nó có thể được thực hiện bằng một truy vấn không.
poelinca

1
Câu trả lời đơn giản: Không. Câu trả lời phức tạp: Có, nếu bạn gói nó trong một thủ tục được lưu trữ . Vì vậy, bạn có thể thực thi nó trong một lệnh, nhưng nó sẽ giống như gọi một kịch bản.
Gaius

4

Bạn nên truy vấn các bảng hệ thống cho các tên bảng đó và xây dựng một chuỗi để thực thi nó một cách linh hoạt. Trong SQL Server, tôi sẽ làm một cái gì đó như:

declare @x varchar(max), @enter char(2);
select @x = '', @enter = char(13)+char(10);

Select @x = @x + 'drop table ' + table_name + ';' + @enter    
from information_schema.tables    
where table_name like '%accounting%'

print @x
execute (@x);

Bây giờ bạn phải tìm bảng hệ thống tương ứng trong MySQL.


Tôi đọc câu trả lời của bạn rất cẩn thận. Điều này đồng nghĩa với câu trả lời của tôi. Mặc dù trong phương ngữ SQL Server, về nguyên tắc, câu trả lời của bạn là câu trả lời đúng đầu tiên. +1 !!!
RolandoMySQLDBA

3

Để trả lời câu hỏi của bạn, không. Không có trong MySQL sử dụng một lệnh / truy vấn duy nhất. Bạn sẽ phải xâu chuỗi các lệnh.

Tuy nhiên, nếu bạn muốn thực hiện mục tiêu của mình, đây là một cách:

Từ một tập lệnh bash giống như:

#/bin/bash
TABLES=`mysql -s -e "SELECT CONCAT(TABLE_SCHEMA,'.',TABLE_NAME) AS T FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'dp_%'" -u user -p`

for i in $TABLES; 
do 
 echo "DROP TABLE $i;" >> drops.sql ; 
done

cat drops.sql

Sau đó xem lại tập tin giọt.sql. Nếu mọi thứ đều tốt, hãy tạo BACKUP , sau đó ...

mysql -u username -p -v --show-warnings < drops.sql

1

Bạn luôn có thể sử dụng một QUẢN TRỊ QUẢNG CÁO như navicat và loại vấn đề đó sẽ được giải quyết với một lựa chọn và xóa đơn giản.

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.