sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man väljer från variabel som är ett tabellnamn n Postgre>=9.2

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 ...



  1. CURRENT_TIMESTAMP i millisekunder

  2. Modellera en databas för registrering av försäljning. Del 1

  3. SQL Server Performance TOP CPU Query -1

  4. Oracle ojämlikhetsoperator:¬=