PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да изберете от променлива, която е име на таблица n Postgre>=9.2

Правилният отговор е коментар от Антон Коваленко

Никога не можете да използвате променлива като име на таблица или колона във вграден SQL.

UPDATE dynamic_table_name SET ....

PostgreSQL използва подготвени и запазени планове за вграден SQL, а препратките към целеви обекти (таблици) са дълбоко и твърдо кодирани в плановете - някои характеристики имат значително влияние върху плановете - за една таблица може да се използва индекс, за друга не. Планирането на заявките е сравнително бавно, така че PostgreSQL не го опитва прозрачно (без малки изключения).

Трябва да използвате динамичен SQL - една цел се използва за подобни ситуации. Винаги генерирате нов SQL низ и плановете не се записват

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

Внимание:Динамичният SQL е опасен (има SQL инжекция рискове) без дезинфекция на параметрите. Използвах функция „format " за него. Друг начин е да използвате "quote_ident ".

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Настройки за екраниране на низове на PostgreSQL

  2. Asp.net MVC4, PostgreSQL и SimpleMembership

  3. Задайте IGNORECASE и други опции за H2 в игра! Рамков тест

  4. Docker Compose и Postgres:Името не се разрешава

  5. Географски разпръснати сървъри, PostgreSQL и JPA