Mysql 一次更新所有列
我有下表Mysql 一次更新所有列,mysql,sql,Mysql,Sql,我有下表 No A B C D A1 1 2 0 0 B1 1 1 1 1 C1 1 1 2 3 我必须查找所有列,如果任何列大于1,我必须将其更改为1。 因此,输出将是 No A B C D A1 1 1 0 0 B1 1 1 1 1 C1 1 1 1 1 是否有一种方法可以同时完成这一切,而不是在update查询中逐个指定每个列名。我的实际表有185列。使用信息\u模式这非常简单 例如: set group_concat_max_len = 4294967295; select con
No A B C D
A1 1 2 0 0
B1 1 1 1 1
C1 1 1 2 3
我必须查找所有列,如果任何列大于1,我必须将其更改为1。
因此,输出将是
No A B C D
A1 1 1 0 0
B1 1 1 1 1
C1 1 1 1 1
是否有一种方法可以同时完成这一切,而不是在
update
查询中逐个指定每个列名。我的实际表有185列。使用信息\u模式
这非常简单
例如:
set group_concat_max_len = 4294967295;
select concat(
'update ',
table_schema,
'.',
table_name,
' set ',
group_concat(concat(' ',column_name,' = least(',column_name,',1)')),
';'
) as update_stmt
into outfile '/tmp/update_all_the_columns.sql'
from information_schema.columns
where table_schema = 'your_schema'
and table_name = 'your_table';
\. /tmp/update_all_the_columns.sql
不,不是真的。不是在普通sql中。您可以查询信息\u模式以获取字段名并动态构建185列更新查询,但这不再是普通sql。与剪切/粘贴所有字段名并将其格式化为单个字段相比,您可能还需要花费更多的时间调试sql生成逻辑update@MarcB谢谢是的,我是这么做的。。我想会有一个更优雅的方法来做这件事。你坚持这个模式吗?如果没有,您可以重构为3个表,其中一个表有“Item”、“Attribute”和“Value”等列。@Rick-EAV表有自己的问题集,这会使将来的查询变得非常困难。它们确实有自己的位置,但不需要经常使用。这就是说,185列似乎有点太宽了,所以它可能需要另一种外观(尽管问题/站点不同)。