我不明白postgresql的nextval()是如何工作的,有人可以解释吗?
技术问答
461 人阅读
|
0 人回复
|
2023-09-14
|
在担任前端开发人员的头几个月后,我才开始涉足后端开发。我正在使用postgreSQL,似乎无法将我的头放在nextval()函数周围。我读了这篇,但对我来说还不清楚。: s% E( l6 O0 [) s( y5 z- }2 s# f
http://www.postgresql.org/docs/current/interactive/functions-3 H: |; T& N$ c! e3 Q/ U
sequence.html nexval()有什么好处/用例?- t/ c8 a4 A5 T) F
' U5 k3 e3 `6 y
解决方案:
2 Z1 D3 M1 @/ ^9 }) T* c 4 E- e. S0 F$ E
% _5 Y; L- T8 z# S. J; T3 B% ?4 o6 X
NEXTVAL 是从序列中获取下一个值的函数。
9 m3 j6 K. }, }序列是一个对象,它返回不断增加的数字,每次调用都不同,而与事务等无关。, [4 Z0 H; I* Y% b" a; K' U
每次致电NEXTVAL,您都会得到一个不同的号码。0 X- I e4 F0 B# b8 ^$ v
这主要用于为您的表生成代理主键。. f" {) u$ p( s3 Y; j! ` @
您可以创建一个表,如下所示:" q3 G* ~# ?+ W7 o1 o6 \
CREATE SEQUENCE mysequence;
% v$ X6 u' t6 z6 D* I2 pCREATE TABLE mytable (id BIGINT NOT NULL PRIMARY KEY, value INT);3 |- {4 z& Z7 s( T
并插入如下值:
4 B: R$ H; K/ i9 k. a6 XINSERT
5 w5 g/ p' k& E1 [- M3 P. XINTO mytable (id, value)
3 ~$ B( ^; z9 ^) Z: q' T% tVALUES
" X8 M5 I5 Z9 ]1 x1 H; [0 r (NEXTVAL('mysequence'), 1),
5 X% M+ b0 r3 F$ v! o) J7 o0 w (NEXTVAL('mysequence'), 2);; N/ T! J1 _# c" G K# I3 u
看看你得到什么:- C1 Z; w/ k# U5 P4 }2 u2 q* _
SELECT * FROM mytable;! H7 o5 U) D3 o" B4 T0 q! `
id | value
; n1 b+ e( w" K) m----+-------) b, Y8 c. c8 l% L- W/ V
1 | 1) y+ n. |' s) b( B
2 | 2( ? W* |/ G2 C% y) ^/ j' C
PostgreSQL为此提供了一个不错的语法糖:" b% q5 W" \$ }
CREATE TABLE mytable (id BIGSERIAL PRIMARY KEY, value INT);7 m. J1 p' G4 `# z# o
相当于
* }1 k5 O1 Q! _) zCREATE SEQUENCE mytable_id_seq; -- table_column_'seq'7 b9 Z h! y# c4 G0 y1 |- j
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# E2 m% v0 G ?' v# F- P
可以这样使用:' {) p I* d3 e
INSERT3 K/ M) x$ h! R+ Q, ~8 Z. _2 c
INTO mytable (value)! h# U) P! c' A L' T
VALUES (1),
0 e1 j9 _2 O- m! p% Y1 M' s (2); -- you can omit id, it will get filled for you.
2 t, {1 x7 E* Q% w# Y8 i请注意,即使您回滚了insert语句或从两个不同的会话中运行并发语句,返回的序列值也将永远不会相同,也不会被重用(请参阅文档中的精美印刷品,尽管位于CYCLE)。! t7 m0 j' C e/ P8 h
因此,您可以确保所有主键的值都将在表中唯一生成。 |
|
|
|
|
|