我需要为表中的所有列调用mySQL函数。
我知道如何为特定的专栏做这件事像这样:UPDATE `table_name` set `column_name` = function_name(`column_name`)
但我不知道如何同时为所有列执行此操作。提前谢谢。
小澄清:我不想手动提及所有列,因为我可能有200列的表。
但我不知道如何同时对所有列执行此操作。
你就是不能-在update
语法中没有这样的快捷方式。
您可以使用单个update
语句来完成此操作,但需要枚举每一列,如:
update table_name set
column_name1 = function_name(column_name1),
column_name2 = function_name(column_name2),
column_name3 = function_name(column_name3)
另一种选择是使用动态SQL从目录表information_schema.columns
中以编程方式生成正确的查询字符串,然后执行它。对于看起来像一次性任务的任务来说,这似乎非常复杂。。。但这里有一个示例代码:
-- input variables
set @table_schema = 'myschema';
set @table_name = 'mytable';
set @function_name = 'myfunction';
-- in case "GROUP_CONCAT()" returns more than 1024 characters
set session group_concat_max_len = 100000;
-- build the "set" clause of the query string
select
@sql := group_concat(
'`', column_name, '` = ', @table_schema, '.', @function_name, '(`', column_name, '`)'
separator ', '
)
from information_schema.columns
where table_schema = @table_schema and table_name = @table_name;
-- entire query string
set @sql := concat('update ', @table_schema, '.', @table_name, ' set ', @sql);
-- debug
select @sql mysql;
-- execute for real
prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;