回答

收藏

PostgreSQL 9.1主键自动递增

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

我正在尝试添加具有自动增量的主键。0 c4 |" ^, \2 T7 c; _
我已经阅读了一些文档和其他问题-有SERIAL和nextval()声明,但是不起作用。0 A" [4 W5 M) S% H6 Y$ ^
这是我做的:* ^+ R8 z0 u8 X" V* X/ J
CREATE TABLE IF NOT EXISTS "category" (
9 }4 c! g& l* f) s. L2 i" f  "id" integer SERIAL PRIMARY KEY,; j! ?* l) W- z1 j# {: g
  "name" varchar(30) DEFAULT NULL
: R1 l5 ?% g9 k+ o& H( r); // the error near "SERIAL"
4 p% J$ N& E# w, w
) Y4 ]$ W* J6 M6 y$ z' ]CREATE SEQUENCE your_seq;
; u: R0 O, w* _& CCREATE TABLE IF NOT EXISTS "category" (
; M% V& A  T$ r  "id" integer PRIMARY KEY nextval('your_seq'),
- _; U& ^" \( ^+ d  "name" varchar(30) DEFAULT NULL1 D8 M9 Y8 X: {, j- Q9 j
); // the error near 'nextval'2 r% V  f6 t* f' ?7 I  i
我怎么了 我只想将主键增加1。" I* b# @+ [4 x# {4 z. X
                % x5 J4 {! I. N
解决方案:
+ f7 [7 h! G( _               
& X& H7 u& ?- k7 A& R# ?, p) b$ U" j' f7 I# b! A! e3 v3 ^6 Q

. B3 P# }/ l# C( L5 `' Q                serial是或多或少是一种列类型,所以说integer serial就像说text text,只是说serial:
+ Y/ `: ]5 z9 e4 cCREATE TABLE IF NOT EXISTS "category" (9 R. }" W4 `0 Z
  "id" SERIAL PRIMARY KEY,+ d& x4 p3 _4 N' M$ G
  "name" varchar(30) DEFAULT NULL
& W  h8 M" k- F1 i) R$ k6 h);
0 @. U- v3 c( _, J8 c) p如果您想自己创建序列,那么您想id将序列中下一个值的默认值设为默认值,这意味着default nextval('your_seq'):
  f3 _5 p4 M4 J  D1 e: oCREATE SEQUENCE your_seq;7 k6 c4 P1 D. Q6 T( Q
CREATE TABLE IF NOT EXISTS "category" (8 U: ?. ?- {% a
  "id" integer PRIMARY KEY default nextval('your_seq'),: O2 f! {6 D2 c; L
  "name" varchar(30) DEFAULT NULL
; n( o# r! D0 a& ^);
8 O4 X& A. `$ u) j' K为了模拟通常的serial行为,您还需要使表拥有该序列:( a, t7 F8 o2 Z8 M
alter sequence your_seq owned by category.id;
2 A2 x& o/ B8 X8 A. A' |阅读手册的“串行类型”部分可能会很有成果。6 K  O* [/ E& |( N4 w( B' x2 i

- `: r9 ?& `$ T! n. o& y$ Q, R我还建议您不要对表名和列名加双引号,除非必须这样做。PostgreSQL将折叠的标识符以小写因此id而"id"将是相同的事情,但不必要的报价是一个坏习惯,很容易导致行情的大混乱无处不在。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则