我正在尝试使用触发器和序列创建一个自动增量字段(如SERIAL)。我知道只能在字段上使用序列或SERIAL类型,但我必须使用两种方法(触发器和secuences)解决此问题
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();
我尝试这种组合但是没有用,表名只有两个字段,整数id(带触发和序列的自动增量)和varchar名称。
有什么建议吗?
由于
答案 0 :(得分:7)
正如其他用户告诉您的那样,您不需要使用触发器。您可以像这样声明表格:
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');
它没有问题。