Korrekt svar er en kommentar fra Anton Kovalenko
Du kan aldrig bruge variabel som tabel- eller kolonnenavn i indlejret SQL.
UPDATE dynamic_table_name SET ....
PostgreSQL bruger en forberedt og gemt planer for indlejret SQL, og referencer til et målobjekter (tabeller) er dybt og hårdt kodet i planer - nogle karakteristika har betydelig indflydelse på planer - for en tabel kan bruges indeks, for andre ikke. Forespørgselsplanlægning er relativt langsom, så PostgreSQL prøver det ikke gennemsigtigt (uden få undtagelser).
Du bør bruge en dynamisk SQL - et enkelt formål er at bruge til lignende situationer. Du genererer altid en ny SQL-streng, og planer gemmes ikke
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 $$;
Bemærk:Dynamisk SQL er usikker (der er en SQL-injektion risici) uden parametersanering. Jeg brugte en funktion "format " for det. En anden måde er at bruge "quote_ident " funktion.
EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...