Správná odpověď je komentář od Antona Kovalenka
Proměnnou nelze použít jako název tabulky nebo sloupce ve vloženém SQL.
UPDATE dynamic_table_name SET ....
PostgreSQL používá připravené a uložené plány pro embedded SQL a odkazy na cílové objekty (tabulky) jsou v plánech hluboce a pevně zakódovány - některé vlastnosti mají významný vliv na plány - pro jednu tabulku lze použít index, pro jinou ne. Plánování dotazů je relativně pomalé, takže to PostgreSQL nezkouší transparentně (až na výjimky).
Měli byste použít dynamický SQL - jeden účel je použití pro podobné situace. Vždy vygenerujete nový řetězec SQL a plány se neuloží
DO $$
DECLARE r record;
BEGIN
FOR r IN SELECT table_name
FROM information_schema.tables
WHERE table_catalog = 'public'
LOOP
EXECUTE format('UPDATE %I SET id = 10 WHERE id = 15', r.table_name);
END LOOP;
END $$;
Upozornění:Dynamický SQL je nebezpečný (existuje vložení SQL rizika) bez sanitace parametrů. Použil jsem funkci "formát Jiný způsob je použití "quote_ident ".
EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...