web-dev-qa-db-fra.com

requête mySQL pour rechercher toutes les tables d'une base de données pour une chaîne?

Existe-t-il une requête mySQL pour rechercher toutes les tables d'une base de données?

Sinon, pouvez-vous rechercher toutes les tables d'une base de données à partir de l'interface graphique de MySQL Workbench?

Depuis phpmyadmin, il y a un panneau de recherche que vous pouvez utiliser pour sélectionner toutes les tables pour parcourir. Je trouve cela super efficace depuis magento, le package de commerce électronique avec lequel je travaille a des centaines de tableaux et différents détails du produit sont dans différents tableaux.

enter image description here

14
user784637

Si vous voulez le faire purement dans MySQL, sans l'aide d'aucun langage de programmation, vous pouvez utiliser ceci:

## 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 ;

Source: http://forge.mysql.com/tools/tool.php?id=232

12
entropid

Si vous utilisez MySQL Workbench, vous pouvez le faire en faisant un clic droit sur le schéma de base de données que vous souhaitez rechercher, puis "Search Table Data ...".

Là, vous pouvez sélectionner l'option "Rechercher à l'aide de REXEXP", puis taper votre texte de recherche comme d'habitude. Il fournira les lignes de base de données correspondant à votre texte spécifique.

Vous devrez également cocher la case "Rechercher des colonnes de tous types".

12
evaldeslacasa

Alternativement, si votre base de données n'est pas si énorme, vous pouvez effectuer un vidage et effectuer votre recherche dans le fichier généré .sql.

12
ôkio

La recherche de chaîne dans toutes les tables d'une base de données est une tâche complexe. Normalement, vous n'avez pas besoin d'utiliser exactement tous les tableaux et les résultats sont complexes à lire sans mise en page spécifique (arborescence de tableaux avec des correspondances ou similaires)

SQL Workbench/J propose une interface graphique et une version en ligne de commande pour effectuer une telle tâche:

Plus d'informations:

REMARQUE: La recherche avec le pilote jdbc utilise beaucoup de mémoire si elle n'est pas configurée correctement. SQL Workbench/J vous en avertit et bien que la documentation en ligne soit un peu dépassée, les sources de documentation (doc/xml/db-problems.xml) expliquent comment la corriger pour différents BBDD:

Voici un extrait pour postgres:

Par défaut, le pilote JDBC PostgreSQL met en mémoire tampon les résultats obtenus à partir de la base de données avant de les renvoyer à l'application. Cela signifie que lors de la récupération des données, & wb-productname; utilise (pendant un court laps de temps) deux fois plus de mémoire que nécessaire. Cela signifie également que WbExport ou WbCopy lira efficacement l'intégralité du résultat en mémoire avant de l'écrire dans le fichier de sortie. Pour les grandes exportations, nous ne voulions généralement pas cela. Ce comportement du pilote peut être modifié afin que le pilote utilise la récupération basée sur le curseur. Pour ce faire, le profil de connexion doit désactiver l'option "Autocommit" et définir une taille de récupération par défaut supérieure à zéro. Une valeur recommandée est par exemple 10, il se peut que des nombres plus élevés donnent de meilleures performances. Le nombre défini pour la taille de récupération, définit le nombre de lignes que le pilote conserve dans sa mémoire tampon interne avant de demander plus de lignes au serveur principal.

0
albfan

Dans MySQL Workbench, vous pouvez utiliser la fonction Table Data Search . Il peut rechercher dans plusieurs tables et/ou plusieurs bases de données.

0
Philip Olson

Je recommande d'ajouter une ligne

SET sql_notes = 0$$

avant

DROP PROCEDURE IF EXISTS get_table $$

Sinon, il affichera l'avertissement PROCEDURE n'existe pas.

0
user5957221