正解はAntonKovalenkoからのコメントです
埋め込みSQLでテーブル名または列名として変数を使用することはできません。
UPDATE dynamic_table_name SET ....
PostgreSQLは、埋め込みSQL用に準備および保存されたプランを使用し、ターゲットオブジェクト(テーブル)への参照はプランに深くハードエンコードされています(一部の特性はプランに大きな影響を与えます)。1つのテーブルはインデックスとして使用でき、他のテーブルは使用できません。クエリプランニングは比較的遅いため、PostgreSQLは透過的に試行しません(いくつかの例外はありません)。
動的SQLを使用する必要があります -1つの目的は、同様の状況で使用することです。常に新しいSQL文字列を生成し、計画は保存されません
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 $$;
重要:動的SQLは安全ではありません (SQLインジェクションがあります リスク)パラメータのサニタイズなし。関数「format」を使用しました 「それのために。他の方法は「quote_ident」を使用することです 「機能。
EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...