简体   繁体   English

如何使用 MySQL/MariaDB 查询数据库所有表的所有列?

[英]How to query all columns of all tables of a database with MySQL/MariaDB?

I want to find a string value searching in all columns of all tables in a given database.我想在给定数据库中所有表的所有列中找到一个字符串

I've managed to write this query to get all columns and table names in a mariadb database:我设法编写了这个查询来获取 mariadb 数据库中的所有列和表名:

SELECT TABLE_NAME , COLUMN_NAME
FROM information_schema.`COLUMNS`
WHERE TABLE_NAME IN
(SELECT TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'my_database')

But I haven't manage to query all the columns found above.但我还没有设法查询上面找到的所有列。

I want to search for a string, say "mystring", with a LIKE operator.我想用 LIKE 运算符搜索一个字符串,比如“mystring”。 eg例如

SELECT *
FROM TABLE_NAME.COLUMN_NAME
WHERE COLUMN_NAME LIKE '%mystring%'

Edition:版:

As some folks suggested I look at this post but I still cannot make it search in all tables.正如一些人建议我查看这篇文章,但我仍然无法在所有表格中进行搜索。

I tried the following:我尝试了以下方法:

SET @Pattern = '%mystring%';

SELECT @q := concat ('SELECT * FROM table1 WHERE concat (', group_concat(column_name), ', "") LIKE "', @Pattern, '"')
FROM information_schema.columns c
WHERE table_name = 'table1';

PREPARE st FROM @q;
EXECUTE st;

But I don't know how to merge both snippets in order to change table1 to SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_database'但我不知道如何合并两个片段以将table1更改为SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_database'

use procedure,but I don't think it's a good idea..使用程序,但我认为这不是一个好主意..

 DROP PROCEDURE IF EXISTS query_all;
CREATE PROCEDURE query_all(in _key VARCHAR(256))
    BEGIN
      DROP TABLE IF EXISTS result;
            CREATE TEMPORARY TABLE IF NOT EXISTS result (result VARCHAR(4000) NOT NULL);
      BEGIN
                DECLARE s INT DEFAULT 0;
                DECLARE t VARCHAR (256);
                DECLARE c VARCHAR (256);
                DECLARE _CURSOR CURSOR FOR SELECT
                    TABLE_NAME,
                    COLUMN_NAME
                FROM
                    information_schema.`COLUMNS`
                WHERE
                    TABLE_NAME IN (
                        SELECT
                            TABLE_NAME
                        FROM
                            information_schema. TABLES
                        WHERE
                            TABLE_SCHEMA = 'my_database'
                    );
                DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
                open _CURSOR;
                fetch _CURSOR into t,c;
                while s<>1 do
                     SET @sqlstr = concat("INSERT INTO result (`result`)SELECT " ,c," from ",t," where ",c," like '%",_key,"%'"); 
                                PREPARE p_sqlstr FROM @sqlstr;
                                EXECUTE p_sqlstr;
                                DEALLOCATE PREPARE p_sqlstr;
                    fetch _CURSOR into t,c;
                END WHILE;
                CLOSE _CURSOR;
                SELECT * FROM result;
            END;
    END;


CALL query_all('mystring');

my db is mysql5.5.62,i change to 5.5.60-MariaDB,the following procedure may suit you..我的数据库是 mysql5.5.62,我改成 5.5.60-MariaDB,下面的程序可能适合你..

DROP PROCEDURE IF EXISTS query_all;
CREATE PROCEDURE query_all(in _key VARCHAR(256))
    BEGIN
      DROP TABLE IF EXISTS result;
            CREATE TEMPORARY TABLE IF NOT EXISTS result (result VARCHAR(4000) NOT NULL);
      BEGIN
                DECLARE s INT DEFAULT 0;
                DECLARE t VARCHAR (256);
                DECLARE c VARCHAR (256);
                DECLARE _CURSOR CURSOR FOR SELECT
                    TABLE_NAME,
                    COLUMN_NAME
                FROM
                    information_schema.`COLUMNS`
                WHERE
                    TABLE_SCHEMA = 'my_database';
                DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
                open _CURSOR;
                fetch _CURSOR into t,c;
                while s<>1 do
                     SET @sqlstr = concat("INSERT INTO result(`result`)SELECT " ,c," from my_database.`",t,"` where ",c," like '%",_key,"%'"); 
                                PREPARE p_sqlstr FROM @sqlstr;
                                EXECUTE p_sqlstr;
                                DEALLOCATE PREPARE p_sqlstr;
                    fetch _CURSOR into t,c;
                END WHILE;
                CLOSE _CURSOR;
                SELECT * FROM result;
            END;
    END;


CALL query_all('3');

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM