Допустим, у меня есть столбец с именем partner
в нескольких таблицах в одной схеме:
select table_name from information_schema.columns where column_name = 'partner';
Как мне обновить все столбцы, где значение partner = 100
до partner = 101
?
Допустим, у меня есть столбец с именем partner
в нескольких таблицах в одной схеме:
select table_name from information_schema.columns where column_name = 'partner';
Как мне обновить все столбцы, где значение partner = 100
до partner = 101
?
Для одноразовой операции вполне подойдет оператор DO
, выполняющий динамический SQL:
DO
$do$
DECLARE
_tbl text;
BEGIN
FOR _tbl IN
SELECT quote_ident(table_name) -- escape identifier!
FROM information_schema.columns
WHERE table_schema = 'public' -- your schema (!!)
AND column_name = 'partner' -- your column name
LOOP
RAISE NOTICE '%',
-- EXECUTE
'UPDATE ' || _tbl || ' SET partner = 101 WHERE partner = 100';
END LOOP;
END
$do$
Проверьте сгенерированный код, прежде чем комментировать RAISE
и раскомментировать EXECUTE
.
Это в значительной степени упрощенная версия более универсальной функции в этом связанном ответе с дополнительным объяснением:
Информационная схема или системный каталог?
EXECUTE format(...) USING ...
. Кроме того, если вам когда-либо понадобится это сделать, это, вероятно, признак проблемного дизайна базы данных. - person Craig Ringer   schedule 17.12.2014