情况如下:
我有大量的表,每个表都有大量的列,我需要在新系统中处理这个旧的、即将废弃的数据库,我正在寻找一种方法来消除所有显然从未使用过的列。
我想通过过滤掉在任何给定行上具有值的所有列来实现这一点,留下一组所有行中的值都为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
输出应为“column_a”和“column_c”,因为这是仅有的没有任何填充值的列。
7条答案
按热度按时间tct7dpnv1#
通过动态创建(从
INFORMATION_SCHEMA.COLUMNS
表)一个包含要执行的SQL的字符串,然后从该字符串创建preparing a statement并执行它,可以避免使用过程。我们希望构建的SQL如下所示:
这可以通过以下方式实现:
在SQLFIDLE上看吧。
cfh9epnr2#
我不是SQL过程方面的Maven,因此给出了使用SQL查询和PHP/Python脚本的一般概念。
INFORMATION_SCHEMA
数据库上使用SHOW TABLES
或其他查询来获取数据库MY_DATABASE
中的所有表MAX(column_a),MAX(column_b),MAX(column_c),MAX(column_d)
的输出从MY_DATABASE.MY_TABLE中选择最大值(a列)、最大值(B列)、最大值(c列)、最大值(d列)
输出结果为:
NULL
的所有列都是值为NULL
的列kse8i1jr3#
您可以利用 COUNT 聚集函数关于NULL的行为。通过将字段作为参数传递,COUNT 函数将返回非NULL值的数量,而
COUNT(*)
将返回总行数。因此,您可以计算NULL与“可接受”值的比率。我将给予一个具有以下表格结构的示例:
您可以编写一个函数,通过将表名作为输入变量传递,自动从INFORMATION_SCHEMA数据库构造查询。以下是直接从INFORMATION_SCHEMA表获取结构数据的方法:
zbq4xfa04#
SQL Fiddle演示链接
我已经创建了4个表,其中3个用于演示,另外一个
nullcolumns
是解决方案的强制部分,在这3个表中,只有salary
和dept
的列的值全部为空(您可以看看它们的脚本)。最后给出了强制性表格和程序
您可以在本地主机上的所需数据库中复制粘贴并运行(强制部分或全部)sql(只需将分隔符更改为//),然后---
call get();
,然后查看结果您可以轻松地执行存储过程轻松地作为sql在您的phpmyadin 'as it is'只需更改分隔符(在底部的SQL查询框)为// Then
并且享受:)
现在,您可以看到表
nullcolumns
,其中显示了具有100/100空值的所有列沿着表Names在程序代码
if @nor>0
限制结果中不应包含空表中,您可以删除该限制。bkhjykvo5#
我认为您可以使用GROUP_CONCAT和GROUP BY来完成此操作:
(* 未测试 *)
EDIT:文档似乎没有说明GROUP_CONCAT需要相应的GROUP BY,因此请尝试以下操作:
u91tlkcl6#
您可以使用MySQL的信息方案提供的预准备语句来完成此操作:
lmyy7pcs7#
只需简单的查询,您将获得这两列。