postgresql nextval()

时间:2016-04-21 23:12:32

标签: sql postgresql

在我作为前端开发者的前几个月工作之后,我才开始涉足后端开发。我正在使用postgreSQL,似乎无法绕过nextval()函数。我看了这个,但我不清楚。 http://www.postgresql.org/docs/current/interactive/functions-sequence.html nexval()有什么好处/用例?

1 个答案:

答案 0 :(得分:22)

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下阅读文档中的细则)

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