在MySQL表中查找所有仅具有空值的列

She*_*ock 19 mysql sql

情况如下:

我有大量的表,每个表都有大量的列.我需要为新系统处理这个旧的和待弃用的数据库,我正在寻找一种方法来消除所有列 - 显然 - 从未使用过.

我想通过过滤掉在任何给定行上具有值的所有列来做到这一点,留下一组列,其中所有行中的值为NULL.当然,我可以手动对每个列的降序进行排序,但这需要很长时间,因为我正在处理大量的表和列.我估计它是400个表,每个表最多50(!)列.

有什么办法可以从information_schema中获取这些信息吗?

编辑:

这是一个例子:

column_a    column_b    column_c    column_d
NULL        NULL        NULL        1
NULL        1           NULL        1
NULL        1           NULL        NULL
NULL        NULL        NULL        NULL
Run Code Online (Sandbox Code Playgroud)

输出应为'column_a'和'column_c',因为它是唯一没有任何填充值的列.

egg*_*yal 17

您可以通过动态创建(从INFORMATION_SCHEMA.COLUMNS表中)包含要执行的SQL的字符串,然后从该字符串准备语句并执行它来避免使用过程.

我们希望构建的SQL看起来像:

SELECT * FROM (
  SELECT 'tableA' AS `table`,
         IF(COUNT(`column_a`), NULL, 'column_a') AS `column`
  FROM   tableA
UNION ALL
  SELECT 'tableB' AS `table`,
         IF(COUNT(`column_b`), NULL, 'column_b') AS `column`
  FROM   tableB
UNION ALL
  -- etc.
) t WHERE `column` IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

这可以使用以下方法完成:

SET group_concat_max_len = 4294967295; -- to overcome default 1KB limitation

SELECT CONCAT(
         'SELECT * FROM ('
       ,  GROUP_CONCAT(
            'SELECT ', QUOTE(TABLE_NAME), ' AS `table`,'
          , 'IF('
          ,   'COUNT(`', REPLACE(COLUMN_NAME, '`', '``'), '`),'
          ,   'NULL,'
          ,    QUOTE(COLUMN_NAME)
          , ') AS `column` '
          , 'FROM `', REPLACE(TABLE_NAME, '`', '``'), '`'
          SEPARATOR ' UNION ALL '
         )
       , ') t WHERE `column` IS NOT NULL'
       )
INTO   @sql
FROM   INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_SCHEMA = DATABASE();

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Run Code Online (Sandbox Code Playgroud)

sqlfiddle上看到它.


Dhr*_*hak 10

我不是SQL程序方面的专家,因此使用SQL查询和PHP/python脚本给出了一般的想法.

  • SHOW TABLESINFORMATION_SCHEMA数据库上使用或一些其他查询来获取数据库中的所有表MY_DATABASE

  • 执行查询以生成语句以获取特定表中的所有列名称,这将在下一个查询中使用.

 SELECT Group_concat(Concat( "MAX(", column_name, ")" ))
         FROM   information_schema.columns
         WHERE  table_schema = 'MY_DATABSE'
                AND table_name = 'MY_TABLE'
         ORDER  BY table_name,ordinal_position
Run Code Online (Sandbox Code Playgroud)
  • 你会得到像这样的输出 MAX(column_a),MAX(column_b),MAX(column_c),MAX(column_d)

  • 使用此输出生成最终查询:

SELECT Max(column_a),Max(column_b),Max(column_c),Max(column_d)FROM MY_DATABASE.MY_TABLE

输出将是:

   MAX(column_a)    MAX(column_b)   MAX(column_c)   MAX(column_d)
     NULL            1           NULL                1
Run Code Online (Sandbox Code Playgroud)
  • 具有Max值的所有列NULL都是具有所有值的列NULL