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

33 浏览
0 Comments

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

我将我的表定义为:

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

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

CREATE SEQUENCE IF NOT EXISTS accounts_sequence

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

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

0
0 Comments

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

根据您的后端代码,似乎有时需要在进行INSERT操作时获取id值。我知道有两种方法可以做到这一点:

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

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

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

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

0
0 Comments

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

在现代的Postgres版本中,不鼓励使用serial而是推荐使用identity列。然而,serial文档非常详细,而identity列的文档资料非常有限。

如果你想手动调用nextval()函数,可以使用pg_get_serial_sequence()函数来获取序列名称。

下面是一个示例:

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

这段代码将获取名为'accounts'的表中'id'字段的序列,并返回下一个值。

pg_get_serial_sequence函数同样适用于identity列。

希望这个解决方法能帮到你!

0