我不理解postgresql的nextval()如何工作,有人能解释一下吗?

38
1个回答

76

NEXTVAL是一个用于从序列中获取下一个值的函数。

序列是一个对象,每次调用时返回不同的递增数字,与事务等无关。

每次调用NEXTVAL时,您都会获得一个不同的数字。

这主要用于为表生成代理主键。

您可以创建如下的表格:

CREATE SEQUENCE mysequence;
CREATE TABLE mytable (id BIGINT NOT NULL PRIMARY KEY, value INT);

并且像这样插入值:

INSERT
INTO    mytable (id, value)
VALUES
        (NEXTVAL('mysequence'), 1),
        (NEXTVAL('mysequence'), 2);

看看你会得到什么:

SELECT * FROM mytable;
 id | value
----+-------
  1 |     1
  2 |     2

PostgreSQL为此提供了一种不错的语法糖:

CREATE TABLE mytable (id BIGSERIAL PRIMARY KEY, value INT);

等价于

CREATE SEQUENCE mytable_id_seq; -- table_column_'seq'
CREATE TABLE mytable (id BIGINT NOT NULL PRIMARY KEY DEFAULT NEXTVAL('mytable_id_seq'), value INT); -- it's not null and has a default value automatically

并且可以像这样使用:

INSERT
INTO    mytable (value)
VALUES  (1),
        (2);  -- you can omit id, it will get filled for you.

请注意,即使您回滚插入语句或从两个不同的会话运行并发语句,返回的序列值也永远不会相同,并且永远不会被重复使用(在文档中仔细阅读 CYCLE 下的细则说明)。

因此,您可以确信主键的所有值都会在表中生成唯一值。


有没有办法设置多个值呢?比如说,你想对id和日期的组进行此函数操作? - ike
@ike 你具体要用怎样的方法?请单独发布你的设置和想要实现的内容。 - Quassnoi
尝试避免发布冗余的问题,如果这是一个的话,鉴于规则。基本上,如果您能执行nextval(over(id, date), value);。 - ike
@ike:我不太确定它的意思以及它是如何工作的。我大致了解你想要什么,但是有一些注意事项,为了讨论它们,我们需要一个新的问题,而不是在这个问题下进行评论。如果您只是发布一个问题、一些样本数据和期望的输出,那会更好。谢谢! - Quassnoi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接