PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So wählen Sie aus einer Variablen aus, die ein Tabellenname ist n Postgre>=9.2

Richtige Antwort ist ein Kommentar von Anton Kovalenko

Sie können Variablen niemals als Tabellen- oder Spaltennamen in eingebettetem SQL verwenden.

UPDATE dynamic_table_name SET ....

PostgreSQL verwendet vorbereitete und gespeicherte Pläne für eingebettetes SQL, und Verweise auf Zielobjekte (Tabellen) sind tief und fest in Plänen codiert – einige Merkmale haben erhebliche Auswirkungen auf Pläne – für eine Tabelle kann ein Index verwendet werden, für andere nicht. Die Abfrageplanung ist relativ langsam, daher versucht PostgreSQL es nicht transparent (ohne wenige Ausnahmen).

Sie sollten ein dynamisches SQL verwenden - Ein einziger Zweck ist die Verwendung für ähnliche Situationen. Sie generieren immer einen neuen SQL-String und Pläne werden nicht gespeichert

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 $$;

Achtung:Dynamic SQL ist unsicher (es gibt eine SQL-Injection Risiken) ohne Parameterbereinigung. Ich habe eine Funktion "format verwendet " dafür. Ein anderer Weg ist die Verwendung von "quote_ident " Funktion.

EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...