Postgresql 错误:关系不存在
Posted
技术标签:
【中文标题】Postgresql 错误:关系不存在【英文标题】:Postgresql ERROR:relation does not exist 【发布时间】: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() ) 【参考方案1】:您正在创建的函数不知道它应该在users_test
架构中找到序列。
您可以通过在创建函数时指定search_path
来调整:
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'
SET search_path = 'users_test';
创建函数文档。
https://www.postgresql.org/docs/9.3/static/sql-createfunction.html
【讨论】:
【参考方案2】:您应该使用函数的全名(带架构):
SELECT nextval('users_test.res_id_mlb_seq')
【讨论】:
谢谢我也用这个!以上是关于Postgresql 错误:关系不存在的主要内容,如果未能解决你的问题,请参考以下文章
postgres 错误:Postgresql 11.6 中的列不存在错误