2009-09-05 5 views
9

Je travaille sur une base de données MySQL énorme (environ 120 tables). J'essaie d'en comprendre le sens et cela me sera très utile si je peux rechercher toutes les 120 tables + colonnes pour une chaîne que je recherche.façon de rechercher une chaîne dans MySQL

Est-ce possible sur une base de données MySQL?

+0

Voulez-vous que dans une base MySQL pur? Si oui, je ne pense pas qu'il y ait une chance .. – yoda

+0

Possible duplicate de [Chercher dans tous les champs de chaque table d'une base de données MySQL] (https://stackoverflow.com/questions/639531/search-in-all-fields -de toutes les tables d'une base de données mysql) –

Répondre

19

Il existe une solution, qui peut ne pas être ce que vous voulez. Si vous avez déversé la table dans un fichier (mysqldump) avec les données, vous pourrez en greffer toutes les informations.

Cela éliminerait le besoin de longues requêtes de recherche, et c'est le moyen le plus efficace que je puisse penser.

Espérons que cela aide!

+0

merci. Je n'ai pas pensé à ça. J'ai eu le sqldump. – Omnipresent

+0

Voir la réponse de @Arun - si vous ajoutez --extended-insert à mysqldump vous obtiendrez une insertion par ligne facilitant la recherche de quelque chose avec grep – Richard

0

Je voulais juste ajouter à la réponse de Omnipresent, qui est la façon de facto de rechercher un db.

Malheureusement, 99% du temps, mon db est énorme et un vidage moyen a peu de sauts de ligne, ce qui signifie grepping pour la chaîne que je veux retourne la grande majorité du fichier sql.

Je préfère maintenant utiliser le commutateur --tab qui fait un fichier txt délimité par des tabulations par table dans un db. .

Cela signifie que non seulement je reçois un enregistrement par ligne, mais je peux obtenir rapidement la table de mon mandat de recherche est

Essayez ceci:

mysqldump -u user_name -p database_name --tab=tmp 

Où tmp est un répertoire vide vous J'ai créé.

ls de tmp vous donnerait quelque chose comme ceci:

users.sql 
users.txt 
orders.sql 
orders.txt 

où les fichiers contiennent la syntaxe SQL create table et le txt contiennent les données.

Notez que l'option d'onglet utilise SELECT INTO OUTFILE de mysql, ce qui signifie que cette astuce ne peut être effectuée que localement.

0

Dans les machines unix, si la base de données est pas trop grand:

mysqldump -u <username> -p <password> <database_name> --extended=FALSE | grep <String to search> | less -S 
2

Cela vous aidera à trouver une chaîne dans la base de données entière

DELIMITER ## 
CREATE PROCEDURE sp_search1(IN searchstring INT) 
BEGIN 
DECLARE done INT DEFAULT FALSE; 
DECLARE output TEXT; 
    DECLARE table_name TEXT; 
    DECLARE column_name TEXT; 
DECLARE s TEXT; 
DECLARE searchcursor CURSOR FOR 
SELECT table_name,column_name FROM information_schema.columns AS column  
ORDER BY table_name,ordinal_position; 
OPEN searchcursor; 
PREPARE stmt2 FROM 'select * from ? where ? = ?' ; 
search_loop : LOOP 
IF done THEN 
LEAVE search_loop; 
END IF;    
FETCH searchcursor INTO table_name,column_name; 
IF( EXECUTE stmt2 USING table_name, column_name,searchstring) THEN 
INSERT INTO `table_names`(`table_name`) VALUES(@table_name);  
    END IF; 
END LOOP; 
END; 
Questions connexes