回答

收藏

PostgreSQL 9.1主键自动递增

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

我正在尝试添加具有自动增量的主键。) R* p% N: L! \+ Y* c! i
我已经阅读了一些文档和其他问题-有SERIAL和nextval()声明,但是不起作用。+ t6 y" I4 r, Z9 s" ^( _
这是我做的:
+ y: M1 m0 b/ e6 M3 Y% ~CREATE TABLE IF NOT EXISTS "category" (/ |8 ^; u0 M4 a! i3 l% m! _9 z
  "id" integer SERIAL PRIMARY KEY,
' p' Y$ O& b9 |' e1 J( {. @# ~  "name" varchar(30) DEFAULT NULL
$ [) }2 i% @9 v); // the error near "SERIAL"0 F! E2 v' \) C1 E1 [

9 E" U# Y1 r+ {! V! v; FCREATE SEQUENCE your_seq;
7 c, p. M  A  N) m8 j, FCREATE TABLE IF NOT EXISTS "category" (% l/ l& p$ x/ y6 q  n& ^# o
  "id" integer PRIMARY KEY nextval('your_seq'),
: v# X: z. q- P, w  f; f- r  "name" varchar(30) DEFAULT NULL$ [0 Y) a' E) f0 b, R
); // the error near 'nextval'
- |% t3 v* b. v0 f; Y2 i我怎么了 我只想将主键增加1。
- y, Y1 N7 O$ j3 z; R7 d                ( O8 Q) S+ R" W( [
解决方案:
; S9 E& _8 A8 f                ! d% O3 A& r& ?0 t5 r
; q9 @5 V3 _$ W/ s" F6 @* {* ?

/ J2 E% {3 L4 o5 e6 c* ?                serial是或多或少是一种列类型,所以说integer serial就像说text text,只是说serial:8 M% p6 \( h/ M3 {; O) i* F! f
CREATE TABLE IF NOT EXISTS "category" (
3 V: C3 `% S, `  "id" SERIAL PRIMARY KEY,
6 b6 ^- ?/ y+ j% p! G: v  "name" varchar(30) DEFAULT NULL
( f7 P5 a; B. w+ e$ ]# A% w0 S);: o! ^: E' A, l) A
如果您想自己创建序列,那么您想id将序列中下一个值的默认值设为默认值,这意味着default nextval('your_seq'):7 y& X7 y2 k* Y) b# ?' U) n
CREATE SEQUENCE your_seq;
& ^3 u; e+ R9 SCREATE TABLE IF NOT EXISTS "category" (8 p! S" ?& O0 T% g
  "id" integer PRIMARY KEY default nextval('your_seq'),
6 R$ N0 \7 ~$ \1 W2 V- Y1 J  "name" varchar(30) DEFAULT NULL2 D- `( g' V/ C1 G3 r
);
" Z: v8 F* r- b为了模拟通常的serial行为,您还需要使表拥有该序列:, e' t! @- b7 E1 e
alter sequence your_seq owned by category.id;4 e  G# ^& H$ Q
阅读手册的“串行类型”部分可能会很有成果。$ H9 P9 S4 M5 v' T0 C
0 {* e% R: m; g! \) K) d/ z9 b
我还建议您不要对表名和列名加双引号,除非必须这样做。PostgreSQL将折叠的标识符以小写因此id而"id"将是相同的事情,但不必要的报价是一个坏习惯,很容易导致行情的大混乱无处不在。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则