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?
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?
Câu trả lời:
Đâ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 !!!
SUBSTR
kiện trong INSERT
nên là: SUBSTR(table_name, 1, LENGTH(prfx)) = prfx
sau đó nó hoạt động tốt.
Đầ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 --batch
tù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.sql
tại mysql>
dấu nhắc.
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.
Để 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
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.