Як видалити мої таблиці, у яких усі є префікс myprefix_
?
Примітка: потрібно виконати його в phpMyAdmin
Як видалити мої таблиці, у яких усі є префікс myprefix_
?
Примітка: потрібно виконати його в phpMyAdmin
Відповіді:
Ви не можете зробити це лише однією командою MySQL, проте ви можете використовувати MySQL для побудови оператора для вас:
У оболонці MySQL або через PHPMyAdmin використовуйте наступний запит
SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' )
AS statement FROM information_schema.tables
WHERE table_name LIKE 'myprefix_%';
Це створить вислів DROP, який ви можете скопіювати та виконати, щоб скинути таблиці.
EDIT: Тут відмова від відповідальності - згенерований вище заява знищить усі таблиці у всіх базах даних із цим префіксом. Якщо ви хочете обмежити його певною базою даних, змініть запит, щоб він виглядав так, і замініть ім'я бази даних на своє власне ім'я бази даних:
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\_%';
Деякі з попередніх відповідей були дуже хорошими. Я зібрав їх ідеї з деякими поняттями з інших відповідей в Інтернеті.
Мені потрібно було видалити всі таблиці, починаючи з 'temp_' Після кількох ітерацій я придумав цей блок коду:
-- 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;
Я сподіваюся, що це стане в нагоді іншим MySQL / PHP програмістам.
show tables like 'prefix_%';
скопіюйте результати та вставте їх у текстовий редактор або виведіть запит у файл, скористайтеся кількома пошуковими та замінюючими для видалення небажаного форматування та замініть \n
комою, поставленою в ;
кінці та додайте таблицю краплі на передню частину.
ви отримаєте щось таке:
drop table myprefix_1, myprefix_2, myprefix_3;
@ andre-mill рішення добре, але є ще кращі та трохи більш професійні, які допоможуть вам виконати все за один раз. Все одно знадобиться більше однієї команди, але це рішення дозволить використовувати SQL для автоматизованих збірок.
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;
Примітка: цей код залежить від платформи, він є для MySQL, але напевно він може бути реалізований для Postgre, Oracle та MS SQL з незначними змінами.
SELECT CONCAT("DROP TABLE ", table_name, ";")
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME"
AND table_name LIKE "PREFIX_TABLE_NAME%";
Я успішно відкидаю таблицю, редагуючи запит, щоб це сподобалося
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;
Це можна зробити в одній команді за допомогою MySQL:
drop table myprefix_1, myprefix_2, myprefix_3;
Вам, мабуть, доведеться динамічно будувати список таблиць у коді.
Альтернативним підходом було б використання бібліотеки загального призначення для MySQL 5.
Я просто хотів опублікувати точний використовуваний SQL - це щось із суміші найкращих 3 відповідей:
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, щоб воно виконало один запит краплі, як
DROP TABLE table1, table2, ..
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;
Я виявив, що підготовлені заяви були дещо складними, щоб працювати для мене, але встановити значення GROUP_CONCAT_MAX_LEN
було важливо, коли у вас багато таблиць. Це призвело до простого триетапного процесу з вирізанням та вставкою з командного рядка mysql, який для мене чудово працював:
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_%';
Потім обережно виріжте і вставте отриманий довгий вислів DROP .
\G
замість того, щоб ;
дати трохи чистіший результат