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

How to create a PostgreSQL Table id Field and Define a Custom Sequence for It?

我的table定义为:

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

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

CREATE SEQUENCE IF NOT EXISTS accounts_sequence

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

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

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

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

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

请注意,serial 在现代 Postgres 版本中 discouraged 的使用有利于 identity 列。

因此,如前所述,序列栏将为您创建一个序列。此外,如果您在 INSERT 查询中省略 id 字段,该序列将自动递增。

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

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

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

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

根据后端的复杂程度,您也许还可以使用 CTE 与两个表进行交互。 This answer 有一个很好的例子,使用 WITH 语句在同一个查询中将一个 INSERT 中的 id 用于另一个 INSERT。