情况如下:
我有大量的表,每个表都有大量的列.我需要为新系统处理这个旧的和待弃用的数据库,我正在寻找一种方法来消除所有列 - 显然 - 从未使用过.
我想通过过滤掉在任何给定行上具有值的所有列来做到这一点,留下一组列,其中所有行中的值为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 TABLES
在INFORMATION_SCHEMA
数据库上使用或一些其他查询来获取数据库中的所有表MY_DATABASE
执行查询以生成语句以获取特定表中的所有列名称,这将在下一个查询中使用.
Run Code Online (Sandbox Code Playgroud)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
你会得到像这样的输出 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)
NULL
都是具有所有值的列NULL