web-dev-qa-db-ja.com

データベース内のすべてのテーブルで文字列を検索するmySQLクエリ?

データベース内のすべてのテーブルを検索するためのmySQLクエリはありますか?

そうでない場合、mySQLワークベンチGUIからデータベース内のすべてのテーブルを検索できますか?

Phpmyadminには、検索パネル--すべてのテーブルを選択を使用して検索できます。私が使用しているeコマースパッケージには何百ものテーブルがあり、さまざまな製品の詳細がさまざまなテーブルにあるため、これは非常に効果的です。

enter image description here

14
user784637

プログラミング言語の助けを借りずに、純粋に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

12
entropid

MySQL Workbenchを使用している場合は、検索するDBスキーマを右クリックし、「Search Table Data ... "を実行することでこれを実行できます。

そこで、「REXEXPを使用した検索」オプションを選択し、通常どおり検索のテキストを入力できます。特定のテキストに一致するDB行を提供します。

"すべてのタイプの列を検索する"ボックスもオンにする必要があります。

12
evaldeslacasa

または、データベースがそれほど大きくない場合は、ダンプを作成して、.sqlで生成されたファイルを検索できます。

12
ôkio

データベースのすべてのテーブルの検索文字列は複雑なタスクです。通常、正確にすべてのテーブルを使用する必要はなく、特定のレイアウト(一致するテーブルのツリーなど)なしで結果を読み取るのは複雑です。

SQL Workbench/J は、このようなタスクを実行するためのGUIおよびコマンドラインバージョンを提供します。

より詳しい情報:

注:が適切に構成されていない場合、jdbcドライバーを使用した検索は大量のメモリーを使用します。 SQL Workbench/Jはそのことを警告し、オンラインドキュメントは少し古くなっていますが、ドキュメントのソース(doc/xml/db-problems.xml)は、さまざまなBBDD用に修正する方法を説明しています。

ここにpostgresの抜粋があります:

PostgreSQL JDBCドライバは、デフォルトで、データベースから取得した結果をアプリケーションに返す前にメモリにバッファします。これは、データを取得するときに、&wb-productname; (短時間で)本当に必要なメモリの2倍のメモリを使用します。これは、WbExportまたはWbCopyが結果全体を効果的にメモリに読み込んでから出力ファイルに書き込むことも意味します。大規模な輸出の場合、これは通常望まれません。ドライバのこの動作は、ドライバがカーソルベースの検索を使用するように変更できます。これを行うには、接続プロファイルで「自動コミット」オプションを無効にし、ゼロより大きいデフォルトのフェッチサイズを定義する必要があります。推奨値は、たとえば10、それはより高い数値がより良いパフォーマンスを与えるということかもしれません。フェッチサイズに定義された数は、バックエンドからさらに行を要求する前にドライバーが内部バッファーに保持する行の数を定義します。

0
albfan

MySQL Workbenchでは、 テーブルデータ検索 機能を使用できます。複数のテーブルやデータベースを検索できます。

0
Philip Olson

行を追加することをお勧めします

SET sql_notes = 0$$

DROP PROCEDURE IF EXISTS get_table $$

そうでない場合は、警告が表示されますPROCEDUREは存在しません。

0
user5957221