回答

收藏

SQL表中主键ID之间的间隙

技术问答 技术问答 81 人阅读 | 0 人回复 | 2023-09-13

我有一张桌子,它是:! D+ {5 D: O' H
CREATE SEQUENCE id_seq;; x6 g1 R5 b# W' m# \0 ~" X
CREATE TABLE public."UserInfo"
3 m. T: K" t1 v1 Z' g' G(+ v9 }" H: P0 b2 l+ y7 l3 G1 V
  id bigint NOT NULL DEFAULT nextval('id_seq'),
' O) T7 I8 G! R  phone text,
+ G7 L+ ^: L8 I8 b8 h  password text,
# e% {4 B' l8 j% j- b* R1 f+ s* q  name text,9 B4 Q0 z% Z$ U6 b2 G: I0 C' R  H3 j
  surname text,3 W( R- x, b1 \+ h2 z. W
  middle_name text,
/ ?/ J' A) P! A; _0 K  [1 w* f& M  email text,, ?4 R. q) Y+ X0 n, k: m
  company text,. x; |2 z( k8 {, m$ l4 z
  title text," x% _8 p$ i$ r6 `. z: b9 z+ f
  image_id text,
. T' [' _, k3 Z6 d1 X: `  CONSTRAINT "UserInfo_pkey" PRIMARY KEY (id),* f) E1 l  P; F. i, g
  CONSTRAINT "UserInfo_image_id_key" UNIQUE (image_id),
& D1 A! H6 d4 Z" `% T  CONSTRAINT "UserInfo_phone_key" UNIQUE (phone)
* M$ R- b: H/ O)+ C* J4 o2 o* i: G# |, j- j
WITH (4 K, J/ @! ^& R* {# o' N$ }
  OIDS=FALSE
& A7 [" `' X3 ~; y' z2 w);
' N0 F; q: D8 L. jALTER SEQUENCE id_seq OWNED BY public."UserInfo".id;
8 j% a/ {7 X5 _. n* v* tALTER TABLE public."UserInfo"' e2 e1 i' Y! ~, W
  OWNER TO postgres;. E0 P8 c1 N! L3 }) S
当我提出错误的要求时,例如要为唯一列输入相同的值。“ id”正在增加…这是错误的id请求;, S) L5 g: @. o  b/ S. a( c, Y/ X
ERROR:  null value in column "id" violates not-null constraint) t0 Q3 d0 Q7 A5 L! S" f
DETAIL:  Failing row contains (null, 9921455867, mg123209, name, surname, , namesurname@xxx.com, Company Name, Title Of Person, 123asd).
$ G. ~+ _- l' a' S. P8 F********** Error **********0 _) f6 p) ^7 h
这是我的表结果;/ [9 x4 A/ P$ L, x, k8 c& x+ W
1;"1234477867";"qweff";"Name";"Surname";"''";"namesurname@qwe.com";"Company";"Title";"qwer1234"
! ~( L! x( y8 r4;"5466477868";"1235dsf";"Name";"Surname";"''";"banesyrna@pwqe.com";"Company";"Title";"qwer1235"' |; E* X2 w) H. s% A: `9 [# f
6;"5051377828";"asd123";"Name";"Surname";"''";"qweg@sdcv.com";"Company";"Title";"qwesr1235"
2 s; ~: z  Q9 @3 ?1 @* P9 J& k8 [请帮助我如何解决此问题,我想订购1,2,3.。顺序的..& b7 _. t  e: j5 ]2 |8 ~# i! g% g6 g
               
, u# ]- |2 i3 K解决方案:7 k( @1 D2 a  L: T& H4 d
                % Z1 S* H7 h4 H9 E; m
" w1 X% F# o0 l. F3 {. k. r  k
9 t( Z% G8 ?4 k
                这就是序列的工作方式。
0 q0 A% |( X( @! \" }
( A; U. e: G* _' O: Z" F重要提示:为避免阻塞从同一序列中获取数字的并发事务,绝不会回退nextval操作。也就是说,一旦获取了值,就将其视为已使用且不会再次返回。即使周围的事务稍后中止,或者调用查询最终不使用该值,也是如此。8 ]& Q( C( j/ }$ S

& V2 f) v& f7 _' |0 K# |2 L正如评论中指出的那样,序列中的间隔没有任何危害。如果出于某种原因删除表中的某些行,则会在主键值中创建间隙,并且通常不会为将它们重置为顺序而烦恼。
2 |! Z1 ~: p5 v1 U如果您坚持创建无间隙序列,请阅读此文章:http :
8 @5 o% k9 u# q% \; L& ^1 q//www.varlena.com/GeneralBits/130.php并为慢速插入做好准备。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则