Как вызвать функцию MySQL для каждого столбца, который присутствует в таблице? - PullRequest
1 голос
/ 25 апреля 2020

Мне нужно вызвать функцию mySQL для всех столбцов в таблице.

Я знаю, как это сделать для определенного столбца. Вот так: UPDATE `table_name` set `column_name` = function_name(`column_name`)

Но у меня есть понятия не имею, как это сделать для всех столбцов одновременно. Заранее спасибо.

Небольшое уточнение: я не хочу вручную упоминать все столбцы, так как я, вероятно, мог бы иметь таблицу 200 столбцов.

1 Ответ

1 голос
/ 25 апреля 2020

Но я понятия не имею, как это сделать для всех столбцов одновременно.

Вы просто не можете - в синтаксисе 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;
...