【发布时间】:2015-02-16 10:09:19
【问题描述】:
CREATE OR REPLACE FUNCTION function_create_forum()
RETURNS trigger AS
$$
BEGIN
DECLARE id_course serial;
select id INTO id_course FROM INSERTED;
insert INTO Forum (course,name,type,staff_only) VALUES
(id_course,"Staff lounge",1,true);
--forum 2 creation
--forum 3 creation
END;
$$
LANGUAGE plpgsql VOLATILE;
触发器功能应该创建一个新论坛,只要创建了一个课程,该课程有一个“id”字段是串行的,这会导致问题,因为在“DECLARE”区域内不被接受。
由于在 cmets 中任何人继续指出上面的语法是不正确的(不管在所有其他不使用“串行”的触发器中都可以正常工作),这是代码的另一种变体不起作用。
CREATE OR REPLACE FUNCTION function_create_forum()
RETURNS trigger AS
$$
DECLARE
id_course int;
BEGIN
select id INTO id_course FROM INSERTED;
insert INTO Forum (course,name,type,staff_only) VALUES
(id_course,"Staff lounge",1,true);
--forum 2 creation
--forum 3 creation
END;
$$
LANGUAGE plpgsql VOLATILE;
表创建:
CREATE TABLE Forum (
course serial REFERENCES Course(id) ON DELETE CASCADE NOT NULL,
--omitted details
);
CREATE TABLE Course (
id serial UNIQUE NOT NULL, --the primary key is another column
--omitted details
)
【问题讨论】:
-
serial 不是一个独特的数据类型,它只是声明 int 类型的简写,默认子句具有序列的
nextval()(但仅在表上下文中)postgresql.org/docs/current/static/… - - 在其他情况下,只需使用 int。 -
int 不起作用(试过)
DECLARE id_course int; -
为什么?错误信息?更多细节?这也行不通,但毕竟这行不通。 -- 我现在明白了,您的语法无效:您只能有一个 DECLARE 块,before BEGIN 块 postgresql.org/docs/current/static/plpgsql-declarations.html
-
仍然,你不能使用 serial (这不是真正的类型),使用 int -- 声明不能在 begin-end 块内,除非它有一个单独的内部 begin-end 块也(请参阅我提供的链接中的示例)
-
“不管在所有其他触发器中都可以正常工作” - 我非常怀疑这一点。 Postgres 中没有
inserted
标签: sql postgresql triggers