引用 posgres 序列时出错,错误:i:关系 \"<sequence>\" 不存在

问题描述 投票:0回答:1

我正在使用 PostgresQL 中的序列在 Typescript 中执行如下 Upsert

let SAVE_CUSTOMER = `
INSERT INTO "db"."customers" ("id", "name")
VALUES (NEXTVAL('customers_sq'), $1)
ON CONFLICT ("id") DO UPDATE
  SET "name" = $1;
`;


function saveCustomer(name: string) {
  datasource.query(SAVE_CUSTOMER, name)
}

地点:

  • “db”是数据库的名称
  • “customers”是表的名称
  • “id”是表中的主键
  • “名称”是表中的另一列

我收到以下错误消息:

error: i: relation \"customers_sq\" does not exist

我尝试过的事情也不起作用:

  • 更新为
    NEXTVAL('db'.'customers_sq')
  • 更新为
    NEXTVAL("db"."customers_sq")
  • 更新为
    NEXTVAL("customers_sq")

我可以在 Postgres 数据库查看器中看到该序列(也是全部小写)。有关如何调试的任何提示?

postgresql upsert nextval
1个回答
0
投票

函数

nextval()
需要一个regclass类型的
单个参数
,即“对象标识符类型”,这基本上是基本类型OID上的域。 说明书:

按命名空间分组的对象的所有 OID 别名类型 接受模式限定名称,并将显示模式限定名称 如果在当前搜索路径中找不到该对象,则在输出中 没有资格。例如,

myschema.mytable
是可以接受的 输入
regclass
(如果有这样的表格)。该值可能是 输出为
myschema.mytable
,或只是
mytable
,具体取决于 当前搜索路径。

因此,如果您的模式名称是

db
并且序列是
customers_sq
- 都是令人惊讶的选择! - 那么这是正确的调用:

SELECT nextval('db.customers_sq')
© www.soinside.com 2019 - 2024. All rights reserved.