0

我的表定义为:

CREATE TABLE accounts IF NOT EXISTS (
   id SERIAL PRIMARY KEY, 
   name VARCHAR(100) NOT NULL
);

在某些情况下,我想在将数据插入 PostgreSQL 的表之前获取下一个 id 值。所以,我为此创建了一个序列:

CREATE SEQUENCE IF NOT EXISTS accounts_sequence

我可以从序列中获取下一个 val,然后在插入时使用它。但是,如果我在不提供 id 的情况下插入一行,它需要按相同的顺序自动递增。

如何创建 PostgreSQL 表 id 字段并为其定义自定义序列?

4

2 回答 2

1

serial列将在后台自动创建一个序列。

如果要手动调用nextval(),可以使用pg_get_serial_sequence()获取序列名称:

 select nextval(pg_get_serial_sequence('accounts', 'id'));

请注意,在现代 Postgres 版本中serial鼓励identity使用 以支持列。

于 2021-09-08T20:12:21.117 回答
0

因此,正如已经说明的那样,连续列将为您创建一个序列。id此外,如果您在 INSERT 查询中省略该字段,该序列将自动递增。

听起来对于您的后端代码,您有时需要id在执行 INSERT 时获取值。我知道有两种方法可以做到这一点:

  1. 使用SELECT nextval(<mysequence>). 然后将该数字注入您的 INSERT 查询。
  2. 在 INSERT 查询中使用RETURNING子句。在这种情况下,数据将保存在数据库中并返回您的字段。我经常使用这种策略。

使用第二种方法,您的查询可能如下所示

INSERT INTO accounts (name) 
VALUES ('Joe Cool') 
RETURNING id;

根据后端的复杂程度,您还可以使用 CTE 与两个表进行交互。这个答案有一个很好的例子,使用 WITH 语句将一个 INSERT 中的 id 使用到另一个 INSERT 中,所有这些都在同一个查询中。

于 2021-09-09T16:27:59.693 回答