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

Posted

技术标签:

【中文标题】如何使用 MySQL/MariaDB 查询数据库所有表的所有列?【英文标题】:How to query all columns of all tables of a database with MySQL/MariaDB? 【发布时间】:2019-12-31 06:22:58 【问题描述】:

我想找到一个字符串value在给定数据库中搜索所有表的所有列

我已经编写了这个查询来获取 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')

但我没有设法查询上面找到的所有列。

我想用 LIKE 运算符搜索一个字符串,比如“mystring”。 例如

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

版本:

正如一些人建议的那样,我查看this post,但我仍然无法让它在所有表格中搜索。

我尝试了以下方法:

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;

但我不知道如何合并两个 sn-ps 以将 table1 更改为 SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_database'

【问题讨论】:

'%mystring%' 是部分表名? 这能回答你的问题吗? mysql query search a string in all columns of a table @tcadidot0: 不,%mystring% 将是在数据库中所有表的所有列的值中查找的搜索模式。 你使用 phpMyAdmin 吗?如果是,并且这是一个非自动搜索要求,那么您可以使用其中的数据库级别搜索选项。 hostpapasupport.com/search-database-using-phpmyadmin 你的问题不清楚:是要在特定列的内容中查找字符串还是要查找与字符串匹配的列名? 【参考方案1】:

使用程序,但我认为这不是一个好主意..

 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');

我的数据库是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');

【讨论】:

嗨@daiwenlong,我测试了你的sn-p,但它不起作用。 SQL Error [1064] [42000]: (conn:294591) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'CREATE PROCEDURE query_all (IN _key VARCHAR(256)) BEGIN DROP TABLE IF EXIS' at line 2 Query is : 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) @DamonHill 我在 mysql&mariadb 中测试了这个过程,它可以工作,试试吧..

以上是关于如何使用 MySQL/MariaDB 查询数据库所有表的所有列?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自定义连接器正确终止 Django 中的 MySQL/MariaDB 连接

如何在 MySQL/MariaDB 中将 LONGTEXT 字段作为 JSON 返回

[SQL] 0x00 初识SQL 及 MySQL/MariaDB 安装

MySQL/MariaDB基础第二次

Mysql(MariaDB)每次查询与从视图中读取?

MySQL/MariaDB基础