簡體   English   中英

如何創建觸發器以在PostgreSQL中插入數字序列; 但是插入語句在..之前已經過驗證?

[英]How to create trigger to insert a sequence of numbers in postgresql; but the insert statement validated before ..?

大家早上好,我對以下情況有疑問:

我有一個觸發器和一個插入着陸代碼的函數,但是在插入一行時效果很好。 但是,如果因表達式中的任何問題而無法執行插入語句,則序列函數會在插入行之前生成一個值,從而使計算順序丟失。

有一種方法可以更改觸發器或函數,在移至序列函數之前先在INSERT表達式之前對我進行驗證,從而避免計算的跳躍。

副代碼(觸發器和函數)和表的圖像。

CODE:

CREATE TRIGGER trigger_codigo_pech
BEFORE INSERT ON independizacion
FOR EACH ROW
EXECUTE PROCEDURE codigo_pech();

CREATE OR REPLACE FUNCTION codigo_pech()
RETURNS trigger
AS $$

DECLARE
incremento INTEGER;
cod_inde text;

BEGIN
IF (NEW.cod_inde IS NULL OR NEW.cod_inde = '''' ) THEN
incremento = nextval ('codigo_pech');
NEW.cod_inde = 'PECH' || '-' || incremento;
END IF;
RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';

捕獲查詢結果

如您所見,也有必要在主鍵上觸發一個觸發器,以防止計數中的跳轉。

希望能對您有所幫助。 謝謝

您可以incremento.cod_inde DEFERRABLE並初步遞延:

ALTER TABLE incremento ALTER COLUMN cod_inde SET DEFAULT 0;
ALTER TABLE incremento
  ALTER CONSTRAINT incremento_cod_inde_key 
    DEFERRABLE INITIALLY DEFERRED;

然后在AFTER INSERT觸發器中分配nextval('codigo_pech')

CREATE OR REPLACE FUNCTION codigo_pech_after() RETURNS trigger AS $$
BEGIN
  UPDATE incremento SET
    cod_inde = 'PECH-' || (nextval('codigo_pech'))::text
  WHERE id = NEW.id; -- replace id with your table's primary key
END;
$$ LANGUAGE plpgsql;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM