Het juiste antwoord is een opmerking van Anton Kovalenko
U kunt nooit een variabele als tabel- of kolomnaam in embedded SQL gebruiken.
UPDATE dynamic_table_name SET ....
PostgreSQL maakt gebruik van voorbereide en opgeslagen plannen voor embedded SQL, en verwijzingen naar een doelobject (tabellen) zijn diep en hard gecodeerd in plannen - sommige kenmerken hebben een aanzienlijke impact op plannen - voor de ene tabel kan de index worden gebruikt, voor de andere niet. Queryplanning is relatief traag, dus PostgreSQL probeert het niet transparant (zonder enkele uitzonderingen).
U moet een dynamische SQL . gebruiken - een enkel doel wordt gebruikt voor vergelijkbare situaties. U genereert altijd een nieuwe SQL-string en plannen worden niet opgeslagen
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 $$;
Let op:Dynamische SQL is onveilig (er is een SQL-injectie risico's) zonder parametrering. Ik gebruikte een functie "format " ervoor. Een andere manier is het gebruik van "quote_ident " functie.
EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...