MySQL запрос для поиска всех таблиц в базе данных для строки? - PullRequest
11 голосов
/ 23 сентября 2011

Существует ли запрос mySQL для поиска всех таблиц в базе данных?

Если нет, можете ли вы искать все таблицы в базе данных из графического интерфейса MySQL Workbench?

В phpmyadmin есть панель поиска, с помощью которой можно выбрать все таблицы для поиска. Я считаю, что это супер эффективно, так как magento, пакет электронной коммерции, с которым я работаю, содержит сотни таблиц, и различные сведения о продукте находятся в разных таблицах.

enter image description here

Ответы [ 5 ]

12 голосов
/ 19 марта 2015

Если вы используете MySQL Workbench , вы можете сделать это, щелкнув правой кнопкой мыши по схеме БД, в которой вы хотите выполнить поиск, и затем " Поиск в таблице данных ... " ,

Здесь вы можете выбрать опцию « Поиск по REXEXP », а затем набрать текст поиска как обычно. Он предоставит строки БД, соответствующие вашему конкретному тексту.

Вам также необходимо установить флажок «Поиск столбцов всех типов» .

11 голосов
/ 23 сентября 2011

Если вы хотите сделать это исключительно в 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 ;

Источник: http://forge.mysql.com/tools/tool.php?id=232

9 голосов
/ 28 ноября 2016

Кроме того, если ваша база данных не такая большая, вы можете создать дамп и выполнить поиск в сгенерированном файле .sql.

0 голосов
/ 11 сентября 2015

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

SQL Workbench / J предлагает графический интерфейс и версию командной строки для выполнения такой задачи:

Дополнительная информация:

ПРИМЕЧАНИЕ: Поиск с драйвером jdbc использует много памяти, если не настроен должным образом. SQL Workbench / J предупреждает об этом, и хотя онлайновая документация немного устарела, источники документации (doc / xml / db-problem.xml) объясняют, как ее исправить для разных BBDD:

Вот выписка для postgres:

Драйвер JDBC PostgreSQL по умолчанию буферизует результаты, полученные из базы данных в памяти, прежде чем вернуть их в приложение. Это означает, что при получении данные, & wb-productname; использует (на короткое время) вдвое больше памяти, чем на самом деле необходимо. Это также означает, что WbExport или WbCopy будут эффективно прочитать весь результат в память, прежде чем записать его в выходной файл. Для большого экспорта это нам обычно не хотелось. Это поведение драйвера может быть изменено так, чтобы драйвер использовал поиск на основе курсора. Для этого в профиле подключения должна быть отключена опция «Автокоммит», и необходимо определить размер выборки по умолчанию больше нуля. Рекомендуемое значение, например, 10, это может быть что более высокие числа дают лучшую производительность. Число, определенное для размера выборки, определяет количество строк, которые драйвер хранит во внутреннем буфере, прежде чем запрашивать больше строки из бэкэнда.

0 голосов
/ 04 ноября 2014

В MySQL Workbench вы можете использовать функцию Поиск табличных данных .Он может выполнять поиск по нескольким таблицам и / или нескольким базам данных.

...