如何创建一个 PostgreSQL 表的 id 字段并为其定义一个自定义序列?
如何创建一个 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字段并为其定义一个自定义序列?
如前所述,使用serial列可以为您创建一个序列。此外,如果您在INSERT查询中省略id字段,该序列将自动递增。
根据您的后端代码,似乎有时需要在进行INSERT操作时获取id值。我知道有两种方法可以做到这一点:
- 使用
SELECT nextval(<mysequence>)
,然后将该数字注入到INSERT查询中。 - 在INSERT查询中使用RETURNING子句。在这种情况下,数据将保存在数据库中,并返回字段。我经常使用这种策略。
使用第二种方法,您的查询可能如下所示:
INSERT INTO accounts (name) VALUES ('Joe Cool') RETURNING id;
根据您的后端代码的复杂程度,您还可以使用CTE与两个表进行交互。在此答案中有一个很好的示例,使用WITH语句将一个INSERT的id用于另一个INSERT,所有这些都在同一个查询中完成。
如何为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列。
希望这个解决方法能帮到你!