Tümünün öneki olan tablolarımı nasıl silebilirim myprefix_
?
Not: phpMyAdmin'de çalıştırmanız gerekir
Tümünün öneki olan tablolarımı nasıl silebilirim myprefix_
?
Not: phpMyAdmin'de çalıştırmanız gerekir
Yanıtlar:
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_%';
[...] LIKE 'myprefix\_%';
Ö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.
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 \n
virgü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;
@ 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.
SELECT CONCAT("DROP TABLE ", table_name, ";")
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME"
AND table_name LIKE "PREFIX_TABLE_NAME%";
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;
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 .
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;
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;
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 .
\G
yerine ile sonlandırmak ;
biraz daha temiz çıktı sağlar