如何创建 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
值。我知道有两种方法可以做到这一点:
- 使用
SELECT nextval(<mysequence>)
。然后将该数字注入您的 INSERT 查询。
- 在您的 INSERT 查询中使用 RETURNING 子句。在这种情况下,数据将保存在数据库中并返回您的字段。我经常使用这个策略。
使用第二种方法,您的查询可能如下所示
INSERT INTO accounts (name)
VALUES ('Joe Cool')
RETURNING id;
根据后端的复杂程度,您也许还可以使用 CTE 与两个表进行交互。 This answer 有一个很好的例子,使用 WITH 语句在同一个查询中将一个 INSERT 中的 id 用于另一个 INSERT。
我的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
值。我知道有两种方法可以做到这一点:
- 使用
SELECT nextval(<mysequence>)
。然后将该数字注入您的 INSERT 查询。 - 在您的 INSERT 查询中使用 RETURNING 子句。在这种情况下,数据将保存在数据库中并返回您的字段。我经常使用这个策略。
使用第二种方法,您的查询可能如下所示
INSERT INTO accounts (name)
VALUES ('Joe Cool')
RETURNING id;
根据后端的复杂程度,您也许还可以使用 CTE 与两个表进行交互。 This answer 有一个很好的例子,使用 WITH 语句在同一个查询中将一个 INSERT 中的 id 用于另一个 INSERT。