回答

收藏

PostgreSQL 9.1主键自动递增

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

我正在尝试添加具有自动增量的主键。
$ F1 I  B# h  L" t; G我已经阅读了一些文档和其他问题-有SERIAL和nextval()声明,但是不起作用。
6 x8 o/ p& V- u8 H这是我做的:. \- D8 n0 s/ V, x  [9 x% V7 P
CREATE TABLE IF NOT EXISTS "category" (
. u( n9 W8 D" J. s& s: I  "id" integer SERIAL PRIMARY KEY,5 s) a/ F! l/ m0 M& L! ], q/ R
  "name" varchar(30) DEFAULT NULL7 S( h7 w" p, L. a/ N# ?! v( L- c
); // the error near "SERIAL", V$ b4 ?; _8 L' W

, x# ]- q9 I( c, a" E7 V% @9 WCREATE SEQUENCE your_seq;
3 J. k8 I! V! a4 P4 z. ZCREATE TABLE IF NOT EXISTS "category" (
( F# Q- N/ n- g" Y+ R' Q+ `; o  "id" integer PRIMARY KEY nextval('your_seq'),0 }- z( R1 D) a" \6 d
  "name" varchar(30) DEFAULT NULL; y1 d/ x, r' D- J  N8 {; V, n& Q* p
); // the error near 'nextval') c" B0 f" j/ Q  x
我怎么了 我只想将主键增加1。
/ E2 B5 r; R3 B$ Y) Y; K+ x$ M- u               
0 d/ `" o% ]. f4 S) e; r2 m7 _解决方案:
1 g) C2 a$ k) O1 N; p/ r                $ w. E; j( D- m2 y0 P4 A7 O
- V$ W& }; K  W7 u/ N' J: h9 `3 u$ Q

: c$ s  n: n+ R$ U7 v                serial是或多或少是一种列类型,所以说integer serial就像说text text,只是说serial:
& i. k% W9 v" Y3 ~  q. `; tCREATE TABLE IF NOT EXISTS "category" (5 R$ M+ {8 U/ {6 h) i
  "id" SERIAL PRIMARY KEY,
9 U. A/ y6 C# G, f. x5 z) {. F  "name" varchar(30) DEFAULT NULL7 E- r" G; j$ A; a2 N+ C
);
. S+ q; D% R+ [$ E: J如果您想自己创建序列,那么您想id将序列中下一个值的默认值设为默认值,这意味着default nextval('your_seq'):* m  N+ G/ B  w+ j- K
CREATE SEQUENCE your_seq;
8 I5 P+ s5 \/ \% wCREATE TABLE IF NOT EXISTS "category" (
* ]: D& L7 m% u1 T9 \  "id" integer PRIMARY KEY default nextval('your_seq'),
7 k! `# D, }/ Q2 T5 L" |  "name" varchar(30) DEFAULT NULL% ?8 y2 Q& w7 u) O3 M' \+ K0 X
);/ o. P, f4 ?2 [. u) Z
为了模拟通常的serial行为,您还需要使表拥有该序列:0 |7 c8 N0 S8 ?# N: E: F
alter sequence your_seq owned by category.id;" x% p9 {! _2 T/ _! l
阅读手册的“串行类型”部分可能会很有成果。
5 {8 p, g) D2 b! H6 S2 U5 L
' x; [& n. f# }& t/ d' b我还建议您不要对表名和列名加双引号,除非必须这样做。PostgreSQL将折叠的标识符以小写因此id而"id"将是相同的事情,但不必要的报价是一个坏习惯,很容易导致行情的大混乱无处不在。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则