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

Bunun çalışmadığını biliyorum! SQL'de böyle bir şey için eşdeğer nedir? Bunu yapmak için basit bir Python betiğini çalabilirim ancak sadece SQL ile bir şeyler yapıp yapamayacağımızı merak ediyorum. MySQL kullanıyorum. Teşekkür ederim!MySQL toplu masa düşürme tablosu nerede?

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; 

Bu üretecektir ve böyle bir ifade yürütmek - -

cevap

35

Sen prepared statements kullanabilirsiniz sadece hızlı değil saf SQL (bir sürü tabloları düşmesi gerekiyorsa

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

DBA StackExchange http://dba.stackexchange.com/a/1369/877 adresinde benzer şekilde yanıtladım. Hazırlanan Deyim Kullanımı için +1! – RolandoMySQLDBA

+0

Şimdiye kadar hazırlanmış ifadeler kullanmadım. Bana bunu yapmanın yeni bir yolu olduğun için teşekkürler! – ThinkCode

+0

DROP TABLE komutlarını MySQL'in aslında PREPARE ile yürütebileceği bir biçime dönüştürmek için uğraşıyordum. Bu karışıklık berrak yardımcı oldu ve harikalar çalıştı :) – RKeast

8

, Bu soruyu doğrudan cevaplamamak için, bir satırlık kabuk komutu bunu yapabilir:

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

'kuyruk + 2 'Ubuntu'da benim için çalışmadı, kuyruk -n + 2' olması gerekiyordu – STW

+1

Lütfen' tail' kullanmayı bırakın, 'mysql -N' yerine kullanın. Orijinal yanıtın iyileştirilmesi için – Igor

11

Küçük bir gelişme @Devart's answer için genişletici:

Bu komut Konsolun çıkış dek tekrar tekrar yürütülmesi gereken
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; 

NULL

olan değişiklikler şunlardır:

  1. backtick (`) olmayan içeriyorsa (tablo adını sarma standart karakterler)
  2. , LIMIT ekledi kesilme sorunu önlemek için ben hakkında yorum yaptı
  3. Ben eşleşen tablo yoksa bir hata üreten önlemek için Devart en çözümlere bir IFNULL eklemek için faydalı bulduğu senaryoyu
+0

+1. Fakat limit 10 ile bir seferde işlenecek sadece 10 tablo anlamına gelir? – MJoraid

+0

@Joraid, bu doğru. Komut dosyasının kullanım yorumuna dikkat edin: "Konsolun çıkışı" NULL "olana kadar bu betik tekrar tekrar çalıştırılmalıdır. Yani, buna eklenen 'LIMIT' nedeniyle tekrar tekrar tekrarlanmalıdır. –

+0

Hata alıyorum. HATA 1064 (42000): SQL sözdiziminizde bir hata var; 1. satırda 'NULL' yakınında kullanmak için doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuzu kontrol edin –

1

yürütme durdurmak için zaman kontrol çeşit olması bir "baskı" (select @tables;) eklendi sorgu.

SET @tables = IFNULL(CONCAT('DROP TABLE ', @tables),'SELECT NULL;');