Postgresql
PostgreSQL觸發器用繼承覆蓋表上的插入
我們有一個
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
。謝謝!
您可以使用
lastval()
orcurrval()
從序列中獲取最後一個值。或用於nextval()
在插入之前獲取 id,然後顯式插入該值(而不是允許預設值)。第三種選擇是忽略該列,而是使用自然鍵。您可以通過選擇獲得 ID,這表明該表有一個自然鍵。
Lastval 和 currval 對您的連接是私有的,因此必須在發出插入的同一連接上發出。