запрос mySQL для поиска всех таблиц в базе данных для строки?
есть ли запрос mySQL для поиска всех таблиц в базе данных?
Если нет, вы можете искать все таблицы в базе данных из GUI MySQL workbench?
из phpmyadmin есть панель поиска, которую вы можете использовать для выбрать все таблицы поиск по. Я нахожу это супер эффективным, так как magento, пакет электронной коммерции, с которым я работаю, имеет сотни таблиц, а различные детали продукта находятся в разных таблицы.
6 ответов
Если вы хотите сделать это чисто в MySQL, без помощи какого-либо языка программирования, вы можете использовать этот:
## Table for storing resultant output
CREATE TABLE `temp_details` (
`t_schema` varchar(45) NOT NULL,
`t_table` varchar(45) NOT NULL,
`t_field` varchar(45) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
## Procedure for search in all fields of all databases
DELIMITER $$
#Script to loop through all tables using Information_Schema
DROP PROCEDURE IF EXISTS get_table $$
CREATE PROCEDURE get_table(in_search varchar(50))
READS SQL DATA
BEGIN
DECLARE trunc_cmd VARCHAR(50);
DECLARE search_string VARCHAR(250);
DECLARE db,tbl,clmn CHAR(50);
DECLARE done INT DEFAULT 0;
DECLARE COUNTER INT;
DECLARE table_cur CURSOR FOR
SELECT concat('SELECT COUNT(*) INTO @CNT_VALUE FROM `',table_schema,'`.`',table_name,'` WHERE `', column_name,'` REGEXP ''',in_search,''';')
,table_schema,table_name,column_name
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA NOT IN ('information_schema','test','mysql');
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
#Truncating table for refill the data for new search.
PREPARE trunc_cmd FROM "TRUNCATE TABLE temp_details;";
EXECUTE trunc_cmd ;
OPEN table_cur;
table_loop:LOOP
FETCH table_cur INTO search_string,db,tbl,clmn;
#Executing the search
SET @search_string = search_string;
SELECT search_string;
PREPARE search_string FROM @search_string;
EXECUTE search_string;
SET COUNTER = @CNT_VALUE;
SELECT COUNTER;
IF COUNTER>0 THEN
# Inserting required results from search to table
INSERT INTO temp_details VALUES(db,tbl,clmn);
END IF;
IF done=1 THEN
LEAVE table_loop;
END IF;
END LOOP;
CLOSE table_cur;
#Finally Show Results
SELECT * FROM temp_details;
END $$
DELIMITER ;
Если вы используете MySQL Workbench, вы можете сделать это, щелкнув правой кнопкой мыши на схеме БД, которую вы хотите найти, а затем"Данные Таблицы Поиска...".
там вы можете выбрать "поиск с помощью REXEXP опции", а затем введите текст поиска как обычно. Он предоставит строки DB, соответствующие вашему конкретному тексту.
вам нужно будет проверить "Поиск столбцов всех типов" коробка также.
кроме того, если ваша база данных не так велика, вы можете сделать дамп и сделать свой поиск в .сгенерированный sql файл.
рекомендую добавить строку
SET sql_notes = 0$$
до
DROP PROCEDURE IF EXISTS get_table $$
в противном случае он будет показывать предупреждение PROCEDURE
не существует.
в MySQL Workbench вы можете использовать Таблица Поиска Данных характеристика. Он может выполнять поиск по нескольким таблицам и / или нескольким базам данных.
поиск строки во всех таблицах базы данных является сложной задачей. Обычно вам не нужно использовать точно все таблицы, и результаты сложны для чтения без определенного макета (дерево таблиц с совпадениями или тому подобное)
среда SQL верстак/Дж предлагает GUI и версию командной строки для выполнения такой задачи:
больше info:
- http://www.sql-workbench.net/manual/wb-commands.html#command-search-data
- http://www.sql-workbench.net/manual/dbexplorer.html#search-table-data
Примечание: поиск с драйвером jdbc использует много памяти, если не настроен должным образом. SQL Workbench / J предупреждает об этом, и хотя онлайн-документация немного устарела, источники документации (doc/xml/db-problems.XML) объясните, как это исправить для разных BBDD:
вот выдержка для postgres:
драйвер PostgreSQL JDBC по умолчанию буферизует результаты, полученные из базы данных в памяти перед возвращением их в приложение. Это означает, что при получении данные, &wb-productname; использует (в течение короткого промежутка времени) в два раза больше памяти, чем на самом деле необходимый. Это также означает, что WbExport или WbCopy будут эффективно прочитайте все результат в память перед записью в выходной файл. Для крупного экспорта это нам обычно не требовалось. Это поведение драйвера можно изменить, чтобы драйвер использовал извлечение на основе курсора. Для этого в профиле подключения необходимо отключить параметр "Автокоммит" и определить размер выборки по умолчанию больше нуля. Рекомендуемое значение, например, 10, может быть что более высокие цифры дают лучшую производительность. Число, определенное для размер выборки, определяет количество строк, которые драйвер сохраняет во внутреннем буфере перед запросом дополнительных строки из бэкэнда.