在我作为前端开发者工作的头几个月后,我开始涉足后端开发。我正在使用postgreSQL,但似乎无法理解nextval()函数的用法。我阅读了这篇文章,但还是不太清楚。 http://www.postgresql.org/docs/current/interactive/functions-sequence.html 那么,nextval()有什么好处和使用场景呢?
在我作为前端开发者工作的头几个月后,我开始涉足后端开发。我正在使用postgreSQL,但似乎无法理解nextval()函数的用法。我阅读了这篇文章,但还是不太清楚。 http://www.postgresql.org/docs/current/interactive/functions-sequence.html 那么,nextval()有什么好处和使用场景呢?
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
下的细则说明)。
因此,您可以确信主键的所有值都会在表中生成唯一值。