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

Не може да се изпусне временна таблица във функцията на Postgres:използва се от активни заявки в тази сесия

Съобщението за грешка е доста очевидно, не можете да изтриете временна таблица, докато се използва.

Може да успеете да избегнете проблема, като добавите ON COMMIT DROP :

Това обаче вероятно може да бъде по-просто. Ако не имате нужда всички тези временни таблици като начало (което подозирам), можете да ги замените всички с CTE (или повечето от тях вероятно дори с по-евтини подзаявки) и да опростите до една голяма заявка. Може да бъде plpgsql или просто SQL:

CREATE FUNCTION everything(waypoints)
  RETURNS TABLE(node int, xy text[]) AS
$func$
   WITH bbox      AS (SELECT ... FROM waypoints)  -- not the fct. parameter!
    , b_spaces    AS (SELECT ... )
    , b_graph     AS (SELECT ... )
    , local_green AS (SELECT ... )
    , aug_temp    AS (SELECT ... )
    , b_graph2(source, target, cost) AS (
        SELECT ... FROM b_graph
        UNION ALL  -- guessing you really want UNION ALL
        SELECT ... FROM aug_temp
        UNION ALL 
        SELECT ... FROM aug_temp
       )
    , results     AS (SELECT id1, ... FROM b_graph2)
    , pkg         AS (SELECT loc, ... )
   SELECT id1, array_agg(loc) 
   FROM   pkg
   GROUP  BY id1
$func$ LANGUAGE sql;

Изгледите просто съхраняват заявка („рецептата“), а не действителните получени стойности („супата“).

Обикновено е по-евтино да се използват CTE вместо създаване на временни таблици.
Изведени таблици в заявки , сортирани по тяхната типична обща производителност (изключения за специални случаи, включващи индекси). От бавно към бързо:

CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery

UNION ще се опита да сгъне дублиращи се редове. Обикновено хората наистина искат UNION ALL , който просто добавя редове. По-бързо и не се опитва да премахне дупки.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ръчно освободете Postgres LOCK

  2. SQLAlchemy Text Съвпадение на данни в JSON поле с UTF-8

  3. Как да работим с таблици без PRIMARY KEY в Hibernate?

  4. Обединяване на връзки с PostgreSQL JDBC

  5. Ако PostgreSQL count(*) винаги е бавен, как да се пагинират сложни заявки?