空我有一個PG表是這樣的:POSTGRESQL PL/pgSQL的觸發函數返回插入
CREATE TABLE order_status_history (
order_id integer NOT NULL,
status character varying NOT NULL,
sequence integer DEFAULT 1 NOT NULL,
date_status timestamp with time zone DEFAULT now() NOT NULL,
record_state character varying(12) DEFAULT 'ACTIVE'::character varying NOT NULL
);
複合PK上的order_id和序列。 實質上,狀態列是從1開始的每個單獨的order_id的自動遞增值。所以,如果order_id 2已經有兩行,序列將是1和2,對於新行,序列應該是3. 我試圖在插入之前使用觸發器來實現此行爲,但是當我嘗試爲新的order_id插入第一行(即觸發器不必在插入之前更改行),我得到PG的錯誤。說它不能在序列中插入NULL。我看不到我的觸發器函數是如何返回NULL,但我的PL/SQL不是很好,所以我敢肯定這是簡單的...下面的觸發器函數,謝謝。
DECLARE
seq_no INTEGER;
BEGIN
SELECT INTO seq_no MAX(sequence) FROM rar.order_status_history WHERE order_id = NEW.order_id;
IF FOUND THEN
NEW.sequence := seq_no + 1;
END IF;
RETURN NEW;
END;
使用'SELECT max()'獲得一個新的id是一個非常非常糟糕的主意。這不是交易安全的,您的解決方案會在多用戶環境中創建錯誤的序列號。 – 2012-01-27 11:38:41
@a_horse_with_no_name,好的謝謝你,有沒有更好的方法來實現這一目標? – Alpaus 2012-01-27 13:38:12
如果你想使交易安全,你將不得不鎖定表格。 – 2012-01-27 14:05:05