Postgresql

PostgreSQL觸發器用繼承覆蓋表上的插入

  • May 23, 2019

我們有一個documents按時間劃分為子表的表,如documents_2019_01, documents_2019_02。我們使用BEFORE父表上的觸發器documents插入到正確的子表中,然後返回NULL以中止管道,因此它只插入到子表中,但是(你猜對了),這使得插入文件像你一樣痛苦重新查詢創建的 ID。我們已經研究過使用INSTEAD OF觸發器類型,但它們不能應用於表,只能應用於視圖。

這是觸發器使用的目前函式:

CREATE OR REPLACE FUNCTION create_article_partition_and_insert() RETURNS TRIGGER
   LANGUAGE plpgsql
AS
$$
DECLARE
   partition_date TEXT;
   partition      TEXT;
   resultId       BIGINT;
BEGIN
   partition_date := to_char(NEW.updated, 'YYYY_MM');
   partition := TG_RELNAME || '_' || partition_date;
   IF NOT EXISTS(SELECT relname FROM pg_class WHERE relname = partition)
   THEN
       RAISE NOTICE 'A partition has been created %',partition;
       EXECUTE 'CREATE TABLE ' || partition || ' (LIKE ' || TG_RELNAME || ' INCLUDING ALL) INHERITS (' || TG_RELNAME ||
               '); ';
   END IF;
   RAISE NOTICE 'Inserting into %',partition;
   EXECUTE 'INSERT INTO ' || partition || ' SELECT(' || TG_RELNAME || ' ' || quote_literal(NEW) || ').* RETURNING id;'
       INTO resultId;
   NEW.id := resultId;
   RETURN NEW;
END;
$$;

有沒有更好的方法來按時間對插入進行分區並返回子表的插入行而不插入父表?

使用 PG 版本9.6.11

謝謝!

來自 SO 的交叉發布

您可以使用lastval()orcurrval()從序列中獲取最後一個值。或用於nextval()在插入之前獲取 id,然後顯式插入該值(而不是允許預設值)。

第三種選擇是忽略該列,而是使用自然鍵。您可以通過選擇獲得 ID,這表明該表有一個自然鍵。

Lastval 和 currval 對您的連接是私有的,因此必須在發出插入的同一連接上發出。

引用自:https://dba.stackexchange.com/questions/238825