Но я понятия не имею, как это сделать для всех столбцов одновременно.
Вы просто не можете - в синтаксисе update
такого ярлыка нет.
Вы можете сделать это с помощью одного оператора update
, но вам нужно перечислить каждый столбец, например:
update table_name set
column_name1 = function_name(column_name1),
column_name2 = function_name(column_name2),
column_name3 = function_name(column_name3)
Альтернативой может быть использование Dynami c 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;