【发布时间】:2017-09-26 11:46:34
【问题描述】:
我的触发器/序列 postgreSQL 有问题
当我尝试在我的表 res_letterbox 中 INSERT 时出现此错误:
错误:关系“res_id_mlb_seq”不存在
第 1 行:选择 nextval('res_id_mlb_seq') 查询:SELECT nextval('res_id_mlb_seq') 上下文:PL/pgSQL 函数 users_test.trigger_fct_t_res_letterbox_ins() SQL 语句第 5 行**********错误**********
错误:关系“res_id_mlb_seq”不存在 SQL 状态:42P01
上下文:PL/pgSQL 函数 users_test.trigger_fct_t_res_letterbox_ins() SQL 语句第 5 行
我尝试直接在 res_id 列的默认值中设置: nextval('res_id_mlb_seq'::regclass) 它返回我:
错误:关系“res_id_mlb_seq”不存在
--
CREATE SCHEMA users_test;
ALTER SCHEMA users_test OWNER TO users_test;
SET search_path = users_test;
CREATE TABLE res_letterbox (
res_id bigint,
title varchar(255) DEFAULT 'NULL',
...
..
);
CREATE SEQUENCE res_id_mlb_seq INCREMENT 1 MINVALUE 1 NO MAXVALUE START 12602;
DROP TRIGGER IF EXISTS t_res_letterbox_ins ON res_letterbox CASCADE;
CREATE OR REPLACE FUNCTION trigger_fct_t_res_letterbox_ins() RETURNS trigger AS $BODY$
BEGIN
BEGIN
SELECT nextval('res_id_mlb_seq')
INTO NEW.res_id;
EXCEPTION
WHEN OTHERS
THEN
RAISE;
END;
RETURN NEW;
END
$BODY$
LANGUAGE 'plpgsql';
CREATE TRIGGER t_res_letterbox_ins
BEFORE INSERT ON res_letterbox FOR EACH ROW
EXECUTE PROCEDURE trigger_fct_t_res_letterbox_ins();
ALTER SEQUENCE IF EXISTS res_id_mlb_seq RESTART WITH 12603;
【问题讨论】:
-
顺便说一句,您可以通过将列定义为 bigserial 来避免触发+功能。 (+ 也许 setval() )
标签: database postgresql