2012-06-20 42 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

相关问题