【问题标题】:Create autoincrement field with trigger and sequence in Postgres在 Postgres 中使用触发器和序列创建自动增量字段
【发布时间】:2012-06-22 22:27:25
【问题描述】:

我正在尝试使用触发器和序列创建一个自动增量字段(如 SERIAL)。我知道只能在字段上使用序列或 SERIAL 类型,但我必须使用这两种方法(触发器和安全)来解决这个问题

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 名称。

有什么建议吗?

谢谢

【问题讨论】:

  • 只是对“它不起作用”做更多解释。
  • 为什么不想使用简单的SERIAL类型?
  • 您可以在serial 列的关联序列上调用nextval() 用于其他目的。无需使用触发器使事情复杂化。除此之外,没有错误消息,您的问题只是噪音。请逐字包含它。
  • 您可以将nextval('AlimentosSequencia') 设置为此列的默认值,即使它是integer。不需要触发器。
  • 这是一个练习,我必须使用触发器和序列来完成,这里不是评估性能。谢谢

标签: postgresql


【解决方案1】:

正如其他用户告诉您的那样,您不需要使用触发器。您可以像这样声明表:

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');

而且它可以正常工作。

【讨论】:

  • 问题是当我声明 de ID 字段时... :( !!!!但是阅读您的答案我发现了问题。再次感谢
猜你喜欢
  • 2013-01-16
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 2015-09-01
相关资源
最近更新 更多