回答

收藏

PostgreSQL 9.1主键自动递增

技术问答 技术问答 403 人阅读 | 0 人回复 | 2023-09-14

我正在尝试添加具有自动增量的主键。
- e9 q* ^! Q* B! d' H% ~我已经阅读了一些文档和其他问题-有SERIAL和nextval()声明,但是不起作用。' @# N8 M9 Q/ I4 V
这是我做的:$ N( T5 E/ O7 S
CREATE TABLE IF NOT EXISTS "category" (' t  P- W9 S6 i/ G2 l
  "id" integer SERIAL PRIMARY KEY,
; f& I# e* h7 [  y: r# C  "name" varchar(30) DEFAULT NULL9 x& y/ _- U- a' ?) b: Z
); // the error near "SERIAL"
6 p; o5 w, o( a/ G1 e+ W
1 U, H1 J- |0 n6 A3 ?CREATE SEQUENCE your_seq;
! j7 e8 ^# o" W( D6 H8 k3 ECREATE TABLE IF NOT EXISTS "category" (  r4 j% ~/ R" i
  "id" integer PRIMARY KEY nextval('your_seq'),
8 D  ?( Z# P  v5 {7 \8 X* J$ a8 Y& A  "name" varchar(30) DEFAULT NULL
# t0 p9 X7 T8 U9 |4 W) c5 l); // the error near 'nextval'' {+ |  d7 ?6 B6 F, [2 k! ]' E4 V
我怎么了 我只想将主键增加1。$ q5 `% [; x( L+ Z
                  O3 g/ h* r9 m. V' H! c: t$ j7 I
解决方案:
0 t( e9 y* V2 a0 ?6 R                0 ?6 P8 i7 ?0 v3 n! w8 K0 e

) `8 i) R! x: ~& Y2 [. `6 J
6 \5 n* X1 ?9 u5 h                serial是或多或少是一种列类型,所以说integer serial就像说text text,只是说serial:1 c3 i* J( @, g1 t
CREATE TABLE IF NOT EXISTS "category" (" Z8 E& b5 j6 f7 X, p
  "id" SERIAL PRIMARY KEY,
1 |; v+ d) J/ ~- O! n  "name" varchar(30) DEFAULT NULL
0 x+ o1 o+ `( ~);9 y# c- e9 c3 a/ j- ]
如果您想自己创建序列,那么您想id将序列中下一个值的默认值设为默认值,这意味着default nextval('your_seq'):. z$ i/ l9 h* n
CREATE SEQUENCE your_seq;
% \( K0 T! B5 }) V) z5 lCREATE TABLE IF NOT EXISTS "category" (
6 N! e0 k" U+ H- {9 e* G  "id" integer PRIMARY KEY default nextval('your_seq'),
5 _# C/ ~; L" b$ g" b" y( b  "name" varchar(30) DEFAULT NULL
$ C; j, }$ B& l" b7 X: Z! a- F, k);, w- p1 I) V0 l" x; @: b% d- k6 N
为了模拟通常的serial行为,您还需要使表拥有该序列:* _5 {" l+ O$ R
alter sequence your_seq owned by category.id;
: S* M( f* v2 O4 |; p8 f3 y# Z阅读手册的“串行类型”部分可能会很有成果。9 O  X6 Q7 Y6 Z7 G' ?+ D

' x' q6 b" k! v5 _$ g* j我还建议您不要对表名和列名加双引号,除非必须这样做。PostgreSQL将折叠的标识符以小写因此id而"id"将是相同的事情,但不必要的报价是一个坏习惯,很容易导致行情的大混乱无处不在。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则