回答

收藏

SQL表中主键ID之间的间隙

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

我有一张桌子,它是:8 x- n) a, z* t7 N+ F- l
CREATE SEQUENCE id_seq;$ r$ s) f  A. [5 a$ ~
CREATE TABLE public."UserInfo"& ?$ t! }; ^/ t/ C; |- o( u6 e
(
1 s* D! u  O+ ?  id bigint NOT NULL DEFAULT nextval('id_seq'),
# l# m$ L1 U% w; ~- `9 U  phone text,$ m7 L* D. T9 Z/ E# z+ G
  password text,
  m/ M8 b/ D' C9 O/ f$ `+ ^  name text,
4 u* H/ h2 N( v' H; l' T5 w  surname text,2 C3 C1 k' A# \! M; w! u
  middle_name text,
3 ^& a( s- p% M& s, A* T: o8 S  email text,
8 A# Y) ?, q6 K2 A- I4 N5 c; h  company text,
( S* g  K. J+ J  K( m( M4 H0 b3 Y. P  title text,
. t, C) b' @  {  w9 m% @1 v  image_id text,% @- y1 i- [- Z5 _6 ?- v
  CONSTRAINT "UserInfo_pkey" PRIMARY KEY (id),
9 y2 U* v2 W5 b& R  CONSTRAINT "UserInfo_image_id_key" UNIQUE (image_id),
. k: \4 g( c% U! e  CONSTRAINT "UserInfo_phone_key" UNIQUE (phone)5 B# s4 W! `4 Q, j  Q5 e5 t: \
)
  u7 w6 [# u4 h+ O6 S) `WITH (2 c' ?1 I1 F* o7 g  i
  OIDS=FALSE
$ i; p+ A# g' A/ j& A);
* l7 D0 ?; i6 y1 R! @ALTER SEQUENCE id_seq OWNED BY public."UserInfo".id;; C) R8 i9 x( {0 Y1 l
ALTER TABLE public."UserInfo"% V5 o; V. _9 ?4 P7 y3 @0 Q; z8 P
  OWNER TO postgres;- {& P! \4 t, a2 d! `: k8 _
当我提出错误的要求时,例如要为唯一列输入相同的值。“ id”正在增加…这是错误的id请求;) G- x8 E6 g8 C6 Z$ b# Q5 B% i
ERROR:  null value in column "id" violates not-null constraint" X  b2 p& U; z$ P0 o. W* L
DETAIL:  Failing row contains (null, 9921455867, mg123209, name, surname, , namesurname@xxx.com, Company Name, Title Of Person, 123asd).
' [7 G" i3 j6 C4 D6 O) P- v********** Error **********
3 u( Q$ I# f/ Y; u$ ^这是我的表结果;2 f. p! ]9 V3 g& p, Z- M) h
1;"1234477867";"qweff";"Name";"Surname";"''";"namesurname@qwe.com";"Company";"Title";"qwer1234"5 `4 w% S. l1 }4 R- w; _
4;"5466477868";"1235dsf";"Name";"Surname";"''";"banesyrna@pwqe.com";"Company";"Title";"qwer1235"% e+ e  O' c4 F# ~2 Z+ y5 V
6;"5051377828";"asd123";"Name";"Surname";"''";"qweg@sdcv.com";"Company";"Title";"qwesr1235"$ g& g$ o2 S$ G
请帮助我如何解决此问题,我想订购1,2,3.。顺序的..
1 i* u; I0 a! o. ?' M: M6 {' t                ! a% g6 S& T: N8 g; t/ o# C
解决方案:4 W2 O  }) }6 ^9 ]6 O" W
               
/ v( J* o  E1 N
. I  p8 s; ^3 L1 F
" e# i' s; b6 y                这就是序列的工作方式。
: y% e# [( E: y
% l# F' p* F3 h重要提示:为避免阻塞从同一序列中获取数字的并发事务,绝不会回退nextval操作。也就是说,一旦获取了值,就将其视为已使用且不会再次返回。即使周围的事务稍后中止,或者调用查询最终不使用该值,也是如此。' R; G( s% j7 }& E6 F- Z' E/ R

4 S5 J6 ~- Y& ?; A" z& g正如评论中指出的那样,序列中的间隔没有任何危害。如果出于某种原因删除表中的某些行,则会在主键值中创建间隙,并且通常不会为将它们重置为顺序而烦恼。
" {! u7 n6 {; l1 D* w$ ^$ i7 B如果您坚持创建无间隙序列,请阅读此文章:http :
( h2 x" S5 Y, O  Q1 }//www.varlena.com/GeneralBits/130.php并为慢速插入做好准备。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则