2012-06-15 29 views
19
DROP TABLE (
SELECT table_name 
FROM information_schema.`TABLES` 
WHERE table_schema = 'myDatabase' AND table_name LIKE BINARY 'del%'); 

Tôi biết điều này không hoạt động! Tương đương với cái gì đó như thế này trong SQL? Tôi có thể roi ra một kịch bản Python đơn giản để làm điều này nhưng chỉ tự hỏi nếu chúng ta có thể làm điều gì đó với SQL trực tiếp. Tôi đang sử dụng MySQL. Cảm ơn bạn!Bảng thả xuống số lượng lớn MySQL trong đó bảng như thế nào?

Trả lời

35

Bạn có thể sử dụng prepared statements -

SET @tables = NULL; 
SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name,'`') INTO @tables FROM information_schema.tables 
    WHERE table_schema = 'myDatabase' AND table_name LIKE BINARY 'del%'; 

SET @tables = CONCAT('DROP TABLE ', @tables); 
PREPARE stmt1 FROM @tables; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 

Nó sẽ tạo ra và thực hiện một tuyên bố như thế này -

DROP TABLE myDatabase.del1, myDatabase.del2, myDatabase.del3; 
+0

Tôi đã trả lời theo cách tương tự trong DBA StackExchange http://dba.stackexchange.com/a/1369/877. +1 cho việc sử dụng câu lệnh đã chuẩn bị !!! – RolandoMySQLDBA

+0

Tôi chưa sử dụng câu lệnh chuẩn bị trước đây. Cảm ơn đã dạy tôi một cách mới để làm điều đó! – ThinkCode

+0

Tôi đã đấu tranh để có được lệnh DROP TABLE thành một định dạng MySQL thực sự có thể thực thi với PREPARE. Điều này giúp làm sáng tỏ sự nhầm lẫn và làm việc kỳ diệu :) – RKeast

8

Nếu bạn chỉ cần một cách nhanh chóng thả một loạt các bảng (không phải trong SQL tinh khiết, do đó, không trực tiếp trả lời câu hỏi này) một lệnh shell line có thể thực hiện điều đó:

echo "show tables like 'fsm%'" | mysql | tail +2 | while read t; do echo "drop table \`$t\`;"; done | mysql 
+2

'đuôi + 2' không hoạt động đối với tôi trên Ubuntu, cần phải là' tail -n + 2' – STW

+1

Vui lòng ngừng sử dụng 'đuôi', sử dụng' mysql -N' để thay thế. – Igor

11

A minor impro vement để @Devart's answer:

SET @tables = NULL; 
SELECT GROUP_CONCAT(table_schema, '.`', table_name, '`') INTO @tables FROM 
(select * from 
information_schema.tables 
    WHERE table_schema = 'myDatabase' AND table_name LIKE 'del%' 
    LIMIT 10) TT; 

SET @tables = CONCAT('DROP TABLE ', @tables); 
select @tables; 
PREPARE stmt1 FROM @tables; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 

kịch bản này nên được thực hiện liên tục cho đến đầu ra của giao diện điều khiển là NULL

Những thay đổi bao gồm:

  1. backtick (`) bao tên bảng (nếu nó có chứa phi ký tự tiêu chuẩn)
  2. đã thêm LIMIT để tránh sự cố cắt xén tôi đã nhận xét về
  3. thêm một "in" (select @tables;) có một số loại điều khiển khi nào phải ngừng thực hiện các kịch bản
+0

+1 để cải thiện so với câu trả lời gốc. Nhưng với giới hạn 10 có nghĩa là chỉ có 10 bảng để xử lý tại một thời điểm? – MJoraid

+0

@Được rồi, đúng vậy. Lưu ý chú thích sử dụng của tập lệnh: "Tập lệnh này nên được thực thi liên tục cho đến khi đầu ra của giao diện điều khiển là' NULL' ". Đó là, người ta nên lặp lại nó hơn và hơn vì 'LIMIT' được thêm vào nó. –

+0

Tôi gặp lỗi. ERROR 1064 (42000): Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn cho cú pháp đúng để sử dụng gần 'NULL' ở dòng 1 –

1

tôi thấy nó hữu ích để thêm một IFNULL với các giải pháp Devart để tránh tạo ra một lỗi nếu không có bảng phù hợp với truy vấn.

SET @tables = IFNULL(CONCAT('DROP TABLE ', @tables),'SELECT NULL;'); 
Các vấn đề liên quan