一尘不染

SQL表中主键ID之间的间隙

sql

我有一张桌子,它是:

CREATE SEQUENCE id_seq;
CREATE TABLE public."UserInfo"
(
  id bigint NOT NULL DEFAULT nextval('id_seq'),
  phone text,
  password text,
  name text,
  surname text,
  middle_name text,
  email text,
  company text,
  title text,
  image_id text,
  CONSTRAINT "UserInfo_pkey" PRIMARY KEY (id),
  CONSTRAINT "UserInfo_image_id_key" UNIQUE (image_id),
  CONSTRAINT "UserInfo_phone_key" UNIQUE (phone)
)
WITH (
  OIDS=FALSE
);
ALTER SEQUENCE id_seq OWNED BY public."UserInfo".id;
ALTER TABLE public."UserInfo"
  OWNER TO postgres;

当我提出错误的要求时,例如要为唯一列输入相同的值。“ id”正在增加…这是错误的id请求;

ERROR:  null value in column "id" violates not-null constraint
DETAIL:  Failing row contains (null, 9921455867, mg123209, name, surname, , namesurname@xxx.com, Company Name, Title Of Person, 123asd).
********** Error **********

这是我的表结果;

1;"1234477867";"qweff";"Name";"Surname";"''";"namesurname@qwe.com";"Company";"Title";"qwer1234"
4;"5466477868";"1235dsf";"Name";"Surname";"''";"banesyrna@pwqe.com";"Company";"Title";"qwer1235"
6;"5051377828";"asd123";"Name";"Surname";"''";"qweg@sdcv.com";"Company";"Title";"qwesr1235"

请帮助我如何解决此问题,我想订购1,2,3.。顺序的..


阅读 127

收藏
2021-05-05

共1个答案

一尘不染

这就是序列的工作方式。

重要提示:为避免阻塞从同一序列中获取数字的并发事务,绝不会回退nextval操作。也就是说,一旦获取了值,就将其视为已使用且不会再次返回。即使周围的事务稍后中止,或者调用查询最终不使用该值,也是如此。

正如评论中指出的那样,序列中的间隔没有任何危害。如果出于某种原因删除表中的某些行,则会在主键值中创建间隙,并且通常不会为将它们重置为顺序而烦恼。

如果您坚持创建无间隙序列,请阅读此文章:http :
//www.varlena.com/GeneralBits/130.php并为慢速插入做好准备。

2021-05-05