【问题标题】:mySQL query to search all tables within a database for a string?mySQL 查询在数据库中的所有表中搜索字符串?
【发布时间】:2011-11-23 07:05:07
【问题描述】:

是否有用于搜索数据库中所有表的 mySQL 查询?

如果不能,您可以从 mySQL 工作台 GUI 搜索数据库中的所有表吗?

在 phpmyadmin 中,您可以使用一个搜索面板选择所有表格 进行搜索。我发现这非常有效,因为我正在使用的电子商务包 magento 有数百个表格,并且不同的产品详细信息位于不同的表格中。

【问题讨论】:

标签: mysql sql phpmyadmin mysql-workbench


【解决方案1】:

在数据库的所有表中搜索字符串是一项复杂的任务。通常,您不需要完全使用所有表格,并且如果没有特定布局(匹配的表格树等),结果阅读起来很复杂

SQL Workbench/J 提供了 GUI 和命令行版本来执行此类任务:

更多信息:

注意:如果配置不正确,使用 JDBC 驱动程序进行搜索会占用大量内存。 SQL Workbench/J 对此发出警告,尽管在线文档有点过时,但文档来源 (doc/xml/db-problems.xml) 解释了如何针对不同的 BBDD 修复它:

这里是 Postgres 的摘录:

PostgreSQL JDBC 驱动默认缓冲从数据库获取的结果 在将它们返回到应用程序之前在内存中。这意味着在检索数据时,&wb-productname;使用(在短时间内)两倍于实际需要的内存。这也意味着 WbExport 或 WbCopy 将 在将结果写入输出文件之前有效地将整个结果读入内存。 对于大型出口,这通常是不希望的。 可以更改驱动程序的这种行为,以便驱动程序使用基于光标的检索。 为此,连接配置文件必须禁用“自动提交”选项,并且必须定义大于零的默认提取大小。推荐值是例如10,可能是更高的数字提供更好的性能。为获取大小定义的数字, 定义驱动程序在请求更多之前保留在其内部缓冲区中的行数 来自后端的行。

【讨论】:

    【解决方案2】:

    或者,如果您的数据库不是那么大,您可以进行转储并在 .sql 生成的文件中进行搜索。

    【讨论】:

    【解决方案3】:

    如果您使用的是 MySQL Workbench,您可以通过右键单击要搜索的 DB Schema 来完成此操作,然后“搜索表数据...”。

    在那里您可以选择“使用 REEXP 搜索”选项,然后像往常一样键入搜索文本。它将提供与您的特定文本匹配的数据库行。

    您还需要选中“搜索所有类型的列”框。

    【讨论】:

      【解决方案4】:

      在 MySQL Workbench 中,您可以使用 Table Data Search 功能。它可以跨多个表和/或多个数据库进行搜索。

      【讨论】:

        【解决方案5】:

        如果你想纯粹在 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

        【讨论】:

        • 旧帖子,但我也在寻找类似的东西,但以前从未使用过 MySQL 函数或过程。 OP 正在寻找一些东西来搜索数据库中的所有表,但这个过程似乎搜索了所有数据库。它怎么能被限制在它所在的那个?
        • 它的工作方式略有不同,因为它返回带有 search_string = query 的数组(在 LOOP 中查询)。但是当我评论行时: SELECT search_string;并选择计数器; ,然后它按预期工作并且程序返回正确的内容。它可能是由于数据库版本,我的是 MariaDB 10.1.31。
        猜你喜欢
        • 1970-01-01
        • 2019-12-09
        • 1970-01-01
        • 1970-01-01
        • 2018-02-21
        • 2010-10-08
        相关资源
        最近更新 更多