2012-06-20 51 views
5

我在使用觸發器和序列創建自動增量字段(如SERIAL)。我知道,只能用場上的順序或序列類型,但我必須解決這個使用這兩種方法(觸發器和secuences)在Postgres中創建帶有觸發器和序列的自動增量字段

CREATE SEQUENCE AlimentosSequencia; 

CREATE OR REPLACE FUNCTION AlimentoFuncion() 
    RETURNS "trigger" AS 
$BODY$ 
    BEGIN 
     New.id:=nextval('AlimentosSequencia'); 
     Return NEW; 
    END; 
$BODY$ 

LANGUAGE 'plpgsql' VOLATILE; 

CREATE TRIGGER AlimentosTrigger 
    BEFORE INSERT 
    ON alimento 
    FOR EACH ROW 
    EXECUTE PROCEDURE AlimentoFuncion(); 

我嘗試這個組合,但是這麼想的作品,表alimento有兩個字段只有整數id(帶有觸發器和序列的自動增量)和varchar名稱。

有什麼建議嗎?

謝謝

+5

只是給出了一些「它不起作用」的解釋。 –

+2

爲什麼你不想使用簡單的SERIAL類型? –

+3

您可以在'serial'列的相關序列上調用'nextval()'作其他用途。沒有必要用觸發器來使事情複雜化。除此之外,沒有錯誤信息,你的問題只是噪音。請逐字加入。 –

回答

6

其他用戶告訴你,你不需要使用觸發器。您可以申報表是這樣的:

CREATE SEQUENCE AlimentosSequencia; 

CREATE TABLE alimento (
    id integer NOT NULL DEFAULT nextval('AlimentosSequencia') PRIMARY KEY 
,name VARCHAR(255)); 

而當你插入一個新的記錄:

INSERT INTO alimento (name) VALUES ('lemon'); 

另一種可能性是宣佈ID字段作爲serial type,它會自動創建序列。

更新: 好的,這是一個練習。那我不明白是什麼問題?我已測試此代碼:

CREATE SEQUENCE AlimentosSequencia; 

CREATE TABLE alimento (
    id integer NOT NULL PRIMARY KEY 
,name VARCHAR(255)); 

CREATE OR REPLACE FUNCTION AlimentoFuncion() 
RETURNS "trigger" AS 
$BODY$ 
BEGIN 
    New.id:=nextval('AlimentosSequencia'); 
    Return NEW; 
END; 
$BODY$ 
LANGUAGE 'plpgsql' VOLATILE; 

CREATE TRIGGER AlimentosTrigger 
BEFORE INSERT 
ON alimento 
FOR EACH ROW 
EXECUTE PROCEDURE AlimentoFuncion(); 

INSERT INTO alimento (name) VALUES ('lemon'); 

而且它的工作沒有問題。

+0

太棒了!謝謝!! – jgiunta

+0

問題是當我宣佈德ID字段... :(!!!!但讀你的答案我檢測到問題。再次感謝 – jgiunta

相關問題