回答

收藏

PostgreSQL 9.1主键自动递增

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

我正在尝试添加具有自动增量的主键。
: v, N8 b0 v' X4 c  z, e我已经阅读了一些文档和其他问题-有SERIAL和nextval()声明,但是不起作用。
) l: V1 z' z. g; o0 R这是我做的:
2 U# j# z4 a! {+ @9 FCREATE TABLE IF NOT EXISTS "category" () }' g$ B: x0 E% g% e
  "id" integer SERIAL PRIMARY KEY,
+ F7 t4 M! Q9 d& O: V/ t% Z  "name" varchar(30) DEFAULT NULL/ @( G8 t* E; Y* F  d& _( L
); // the error near "SERIAL"
1 A0 V+ I. x0 F' M' X& F+ k5 `9 f1 A' C  s1 r  L
CREATE SEQUENCE your_seq;
6 w- ~2 P" D9 z8 XCREATE TABLE IF NOT EXISTS "category" (
7 ]% x  t; O$ ~8 A' k6 W' A" _  "id" integer PRIMARY KEY nextval('your_seq'),
" J, L& Y8 d1 K! U$ G& p$ w  "name" varchar(30) DEFAULT NULL+ M- r( q$ s# Z/ i
); // the error near 'nextval'" ^2 J3 Q: ?7 z- O
我怎么了 我只想将主键增加1。
8 B5 v" V) O$ b  [                3 m  ^6 o  A- R" ^$ I/ T
解决方案:
& r! k' \1 a! n* H1 b* D               
. l& r3 }  M- A+ ^8 _/ q% Y: ]6 F! _9 d* F, R
( J8 F0 }9 E  r9 |2 S' O
                serial是或多或少是一种列类型,所以说integer serial就像说text text,只是说serial:
  A( p: r# O  oCREATE TABLE IF NOT EXISTS "category" (
  }0 Q0 ?! s5 V) U" T+ k  "id" SERIAL PRIMARY KEY,' X5 K" ?, U* [  h
  "name" varchar(30) DEFAULT NULL: I' P- t0 b$ Z' r2 G
);  {9 i, c# G% g- O4 j+ a, i0 i
如果您想自己创建序列,那么您想id将序列中下一个值的默认值设为默认值,这意味着default nextval('your_seq'):
6 p4 n7 ~/ }  U3 m8 vCREATE SEQUENCE your_seq;: U) u2 o& \3 ^0 c5 p$ L2 e$ R
CREATE TABLE IF NOT EXISTS "category" (
* N) J" V+ g- S  {9 r9 [) n6 S0 c  "id" integer PRIMARY KEY default nextval('your_seq'),
6 Y2 U7 ~# i1 K! I7 @  "name" varchar(30) DEFAULT NULL/ g$ e' `4 Y' \) P
);# y3 w( d- ~! Z% ]) ?4 _2 j9 d
为了模拟通常的serial行为,您还需要使表拥有该序列:4 y3 w, v# a. L) j8 a$ \, ^
alter sequence your_seq owned by category.id;5 G0 w2 Y! y' t* U* }! v2 ^. {
阅读手册的“串行类型”部分可能会很有成果。$ H* v$ R  h% G+ y$ ]" p
% z1 @. o& P8 t! L3 @4 Z
我还建议您不要对表名和列名加双引号,除非必须这样做。PostgreSQL将折叠的标识符以小写因此id而"id"将是相同的事情,但不必要的报价是一个坏习惯,很容易导致行情的大混乱无处不在。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则