我正在使用触发器和序列来创建一个自动增量字段(如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();
Run Code Online (Sandbox Code Playgroud)
我尝试这种组合,但是没有用,表alimento只有两个字段,整数id(带触发器和序列的自动增量)和varchar名称.
有什么建议吗?
谢谢
正如其他用户告诉您的那样,您不需要使用触发器.您可以像这样声明表:
CREATE SEQUENCE AlimentosSequencia;
CREATE TABLE alimento (
id integer NOT NULL DEFAULT nextval('AlimentosSequencia') PRIMARY KEY
,name VARCHAR(255));
Run Code Online (Sandbox Code Playgroud)
当您插入新记录时:
INSERT INTO alimento (name) VALUES ('lemon');
Run Code Online (Sandbox Code Playgroud)
另一种可能性是将id字段声明为串行类型,它将自动创建序列.
更新: 好的,这是一个练习.然后我不明白这是什么问题?我测试了这段代码:
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');
Run Code Online (Sandbox Code Playgroud)
它没有问题.
| 归档时间: |
|
| 查看次数: |
18950 次 |
| 最近记录: |