Rätt svar är en kommentar från Anton Kovalenko
Du kan aldrig använda variabel som tabell- eller kolumnnamn i inbäddad SQL.
UPDATE dynamic_table_name SET ....
PostgreSQL använder förberedda och sparade planer för inbäddad SQL, och referenser till målobjekt (tabeller) är djupa och hårdkodade i planer - en del egenskaper har betydande inverkan på planer - för en tabell kan användas index, för andra inte. Frågeplanering är relativt långsam, så PostgreSQL försöker det inte transparent (utan några få undantag).
Du bör använda en dynamisk SQL - ett enda syfte är att använda för liknande situationer. Du genererar alltid en ny SQL-sträng och planer sparas inte
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 $$;
Observera:Dynamisk SQL är osäkert (det finns en SQL-injektion risker) utan parametersanering. Jag använde funktionen "format " för det. Ett annat sätt är att använda "quote_ident " funktion.
EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...