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 中的列不存在错误

如何解决这个问题以使用 psql? | psql:错误:致命:角色“postgres”不存在

Postgres:当公共模式上存在表时,关系不存在错误

Selenium 与 postgreSQL [重复]

错误:PostgreSQL 中不存在列

Postgresql 错误:关系不存在