mySQL query to search all tables within a database for a string?

后端 未结 5 1208
一生所求
一生所求 2020-11-30 05:03

Is there a mySQL query to search all tables within a database?

If not can you search all tables within a database from the mySQL workbench GUI?

相关标签:
5条回答
  • 2020-11-30 05:44

    In MySQL Workbench you can use the Table Data Search feature. It can search across multiple tables and/or multiple databases.

    0 讨论(0)
  • 2020-11-30 05:51

    If you are using MySQL Workbench, you can do this by doing right click on the DB Schema you want to search into, and then "Search Table Data...".

    In there you can select the "Search using REXEXP" option, and then type your text of search as usual. It will provide the DB rows matching your specific text.

    You will need to check the "Search columns of all types" box as well.

    0 讨论(0)
  • 2020-11-30 05:51

    Alternatively, if your database is not that huge, you can make a dump and make your search in the .sql generated file.

    0 讨论(0)
  • 2020-11-30 05:56

    Search string in all tables on a database is a complex task. Normally you don't need to use exactly all tables and results are complex to read without a specific layout (tree of tables with matches or the like)

    SQL Workbench/J offers a GUI and a command-line version to do such task:

    More info:

    • http://www.sql-workbench.net/manual/wb-commands.html#command-search-data
    • http://www.sql-workbench.net/manual/dbexplorer.html#search-table-data

    NOTE: Search with JDBC driver uses a lot of memory if it is not configured properly. SQL Workbench/J warns about that and although online documentation is a bit outdated, the sources of documentation (doc/xml/db-problems.xml) explain how to fix it for different BBDD:

    Here an extract for Postgres:

    The PostgreSQL JDBC driver defaults to buffer the results obtained from the database in memory before returning them to the application. This means that when retrieving data, &wb-productname; uses (for a short amount of time) twice as much memory as really needed. This also means that WbExport or WbCopy will effectively read the entire result into memory before writing it into the output file. For large exports, this is usually not wanted. This behavior of the driver can be changed so that the driver uses cursor based retrieval. To do this, the connection profile must disable the "Autocommit" option and must define a default fetch size that is greater than zero. A recommended value is e.g. 10, it might be that higher numbers give a better performance. The number defined for the fetch size, defines the number of rows the driver keeps in its internal buffer before requesting more rows from the backend.

    0 讨论(0)
  • 2020-11-30 05:57

    If you want to do it purely in MySQL, without the help of any programming language, you could use this:

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

    0 讨论(0)
提交回复
热议问题