SQL: önekli tabloları silme


Yanıtlar:


178

Bunu tek bir MySQL komutuyla yapamazsınız, ancak MySQL'i sizin için ifadeyi oluşturmak için kullanabilirsiniz:

MySQL kabuğunda veya PHPMyAdmin aracılığıyla aşağıdaki sorguyu kullanın

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%';

Bu, tabloları kaldırmak için kopyalayıp çalıştırabileceğiniz bir DROP ifadesi oluşturacaktır.

DÜZENLEME: Burada bir sorumluluk reddi beyanı - yukarıda oluşturulan ifade, bu öneki tüm veritabanlarındaki tüm tabloları bırakacaktır. Belirli bir veritabanıyla sınırlamak istiyorsanız, sorguyu şöyle görünecek şekilde değiştirin ve veritabanı_adı yerine kendi veritabanı_adınızı yazın:

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%';

Sadece bir veritabanım var, bu yüzden ikincisine ihtiyacım olmayacak.
Deniz Zoeteman

4
@ElijahLynn sınır kaynağı muhtemelen GROUP_CONCAT maksimum uzunluğundan kaynaklanıyor. büyütebilirsiniz, örneğin buraya bakın
Asaf David

7
Kendine not Maksimum karakter sayısını artırın
Muhammed Joraid

2
Bazı durumlarda, tablo önek adlarında alt [...] LIKE 'myprefix\_%';
çizgilerden kaçınmanın

1
Bu, çok sayıda yinelenen tablo_adı döndürür. Pankaj Khurana'nın gönderdiği cevap daha iyi IMHO işe yarıyor.
Jeremy

37

Önceki cevaplardan bazıları çok iyiydi. Fikirlerini web'deki diğer cevaplardan bazı kavramlarla bir araya getirdim.

'Temp_' ile başlayan tüm tabloları silmem gerekiyordu Birkaç yinelemeden sonra bu kod bloğunu buldum:

-- Set up variable to delete ALL tables starting with 'temp_'
SET GROUP_CONCAT_MAX_LEN=10000;
SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME)
               FROM information_schema.TABLES
              WHERE TABLE_SCHEMA = 'my_database'
                AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Umarım bu diğer MySQL / PHP programcıları için yararlıdır.


1
Bu tam olarak doğru cevap. Diğer cevaplar birden fazla adım kullanır veya manuel olarak yapılmasını gerektirir. Bu cevabın 4 yıl sonra nasıl daha fazla oy alacağını bilmiyorum!
gbe

25
show tables like 'prefix_%';

sonuçları kopyalayın ve bir metin düzenleyiciye yapıştırın veya sorguyu bir dosyaya çıktılayın, birkaç arama ve değiştirme kullanarak istenmeyen biçimlendirmeyi kaldırın ve \nvirgülle değiştirin; ve sonuna ve ön tarafa bırakma tablosu ekleyin.

şuna benzer bir şey alacaksın:

drop table myprefix_1, myprefix_2, myprefix_3;

1
kullandığım web barındırıcısında information_schema.tables'a erişimim yoktu, bu yüzden gitmenin yolu buydu!
Florent Roques

10

@ andre-miller çözümü iyidir, ancak hepsini tek seferde gerçekleştirmenize yardımcı olacak daha da iyi ve biraz daha profesyonel çözüm vardır. Yine de birden fazla komuta ihtiyaç duyacak, ancak bu çözüm SQL'i otomatik derlemeler için kullanmanıza izin verecektir.

SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) 
    FROM information_schema.TABLES
    WHERE TABLE_NAME LIKE 'myprefix_%');
PREPARE stmt FROM 'DROP TABLE @tbls';
EXECUTE stmt USING @tbls;
DEALLOCATE PREPARE stmt;

Not: Bu kod platforma bağlıdır, MySQL içindir, ancak kesin olarak Postgre, Oracle ve MS SQL için küçük değişikliklerle uygulanabilir.


ERROR 1064 (42000): SQL sözdiziminizde bir hata var; 1. satırda '@tbls' 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. (stmt) DEALLOCATE PREPARE'e verildi
Roni Tovi

Şurada sözdizimi hatası: 'DROP TABLE @tbls'DEN PREPARE stmt;
ledawg

5
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%";

3

Bunu beğenmek için sorguyu düzenleyerek tabloyu başarıyla bırakıyorum

SET GROUP_CONCAT_MAX_LEN=10000;
SET FOREIGN_KEY_CHECKS = 0;
SET @tbls = (SELECT GROUP_CONCAT(CONCAT('`', TABLE_NAME, '`'))
           FROM information_schema.TABLES
          WHERE TABLE_SCHEMA = 'pandora'
            AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;

Bu, yabancı anahtar kısıtlamalarını ele alırken tüm operasyonu tek bir shebang'da yapan bulduğum tek şeydi.
Evan Mattson

2

Bunu MySQL ile tek bir komutla yapabilirsiniz:

drop table myprefix_1, myprefix_2, myprefix_3;

Yine de muhtemelen tablo listesini dinamik olarak kodda oluşturmanız gerekecek.

Alternatif bir yaklaşım, MySQL 5 için genel amaçlı rutin kitaplığı kullanmak olacaktır .


2

Sadece kullandığım SQL'i tam olarak göndermek istedim - bu, ilk 3 cevabın bir karışımı:

SET GROUP_CONCAT_MAX_LEN=10000;

SET @del = (
    SELECT      CONCAT('DROP TABLE ', GROUP_CONCAT(TABLE_NAME), ';')
    FROM        information_schema.TABLES

    WHERE       TABLE_SCHEMA = 'database_name'
    AND         TABLE_NAME LIKE 'prefix_%'
);

PREPARE stmt FROM @del;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

2

GROUP_CONCAT kullanan başka bir çözüm, bu nedenle DROP TABLE table1, table2, .. gibi bir drop sorgusu yürütür
.

SET @Drop_Stm = CONCAT('DROP TABLE ', (
      SELECT GROUP_CONCAT(TABLE_NAME) AS All_Tables FROM information_schema.tables 
      WHERE TABLE_NAME LIKE 'prefix_%' AND TABLE_SCHEMA = 'database_name'
)); 
PREPARE Stm FROM @Drop_Stm; 
EXECUTE Stm;
DEALLOCATE PREPARE Stm;

1

Hazırlanan ifadelerin benim için çalışmak biraz zor olduğunu anladım, ancak GROUP_CONCAT_MAX_LENçok sayıda masanız olduğunda bunları ayarlamak çok önemliydi. Bu , benim için harika çalışan mysql komut satırından kes ve yapıştır ile basit bir üç aşamalı işlemle sonuçlandı :

SET GROUP_CONCAT_MAX_LEN=10000;
SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%';

Sonra ortaya çıkan uzun DROP ifadesini dikkatlice kesip yapıştırın .


sorguyu \Gyerine ile sonlandırmak ;biraz daha temiz çıktı sağlar
Stuart Cardall
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.