Удалить таблицу в нескольких базах данных

Есть ли способ удалить таблицу в нескольких базах данных с помощью MYSQL? Я использую Sequel Pro, но не вижу возможности сделать это в графическом интерфейсе, поэтому мне интересно, есть ли какая-то команда, которая может это сделать?

Имя таблицы одинаково во всех базах данных, и удаление их по одному занимает много времени. Это действительно помогло бы очистить базы данных, поскольку у нас их сотни, и все они используют одни и те же таблицы. Однако некоторые таблицы больше не нужны и их необходимо удалить.

Надеясь, что кто-то может помочь с запросом для этого.


person Cole    schedule 25.04.2017    source источник
comment
Вы можете получить список баз данных с таблицей из информационной схемы, использовать ее для написания операторов drop table и выполнять их в цикле for next.   -  person Sloan Thrasher    schedule 26.04.2017
comment
Что вы имеете в виду по базам данных? вы можете удалить имя таблицы специально, даже если хотите использовать его цикл. Независимо от того, хотите ли вы удалить всю таблицу из этой конкретной базы данных   -  person Vijunav Vastivch    schedule 26.04.2017
comment
Я имею в виду удаление одной и той же таблицы в нескольких базах данных. Скажем, например, у вас есть 200 баз данных с одинаковой структурой таблиц, и вам больше не нужно несколько таблиц. Я интересовался, как получить список всех баз данных и таблицы и запустить таблицу удаления для всех этих баз данных.   -  person Cole    schedule 26.04.2017


Ответы (1)


Вам нужно будет запустить отдельный оператор DROP для каждой таблицы.

Мы можем запросить information_schema.tables, чтобы получить список таблиц...

SELECT t.table_schema, t.table_name
  FROM information_schema.tables t
 WHERE t.table_name = 'tablename_i_want_to_drop'
   AND t.table_schema NOT IN ('mysql','information_schema','performance_schema') 
 ORDER BY t.table_schema, t.table_name 

И мы можем использовать выражение вместо столбцов...

SELECT CONCAT('DROP TABLE `',t.table_schema,'`.`',t.table_name,'` ;') AS `-- stmt` 
  FROM ...

Затем мы можем взять этот набор результатов и сохранить его, а затем выполнить операторы из скрипта. Клиент командной строки MySQL позволяет нам получить скрипт...

https://dev.mysql.com/doc/refman/5.7/en/mysql-batch-commands.html

Клиент, который вы используете, может иметь аналогичную функцию для выполнения скрипта. Или каким-то образом скопируйте набор результатов и вставьте его в окно запроса.


В хранимой программе MySQL мы могли бы запустить тот же запрос (чтобы получить список таблиц), а затем зациклить их (используя КУРСОР) и ПОДГОТОВИТЬ, ВЫПОЛНИТЬ и DEALLOCATE PREPARE для выполнения операторов «удалить таблицу». Это вариант, но на один раз создать сценарий было бы проще.

person spencer7593    schedule 26.04.2017
comment
Верхний скрипт отлично работал для получения вывода списка. Я могу легко экспортировать этот список или скопировать его в Sequel Pro. Не могли бы вы подробнее рассказать о том, как будет выглядеть этот сценарий, или я могу просто запустить вторую часть, которую вы добавили, заменив верхнюю строку, и она будет выполнять то же самое, что и сценарий? - person Cole; 26.04.2017
comment
Выполнение оператора SELECT просто генерирует набор результатов. Результатом является набор операторов DROP. (Я просто использую SQL для генерации SQL.) Это двухэтапный процесс: 1) генерировать операторы DROP и 2) как отдельный шаг. выполнить операторы DROP. Для этого нам нужна клиентская программа... 1) запустить SELECT и 2) выполнить операторы DROP. Единственный способ сделать это за один вызов сервера базы данных — вызвать хранимую процедуру MySQL. Процедура будет заключаться в том, что клиент выполняет два шага. (Очевидно, что сначала нам придется написать эту процедуру.) - person spencer7593; 26.04.2017
comment
Это сработало отлично. Я смог легко вставить первую команду, чтобы получить операторы удаления в разделе запросов сиквела про. Скопировав операторы удаления и вставив их в новую область запроса, я мог запустить это, и он выполнил каждый запрос и удалил таблицы. Спасибо вам за помощь. - person Cole; 27.04.2017