sql表中主键id之间的差距

问题描述 投票:0回答:2

我有一张桌子:

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, , [email protected], Company Name, Title Of Person, 123asd).
********** Error **********

这是我的表格结果;

1;"1234477867";"qweff";"Name";"Surname";"''";"[email protected]";"Company";"Title";"qwer1234"
4;"5466477868";"1235dsf";"Name";"Surname";"''";"[email protected]";"Company";"Title";"qwer1235"
6;"5051377828";"asd123";"Name";"Surname";"''";"[email protected]";"Company";"Title";"qwesr1235"

请帮助我如何解决这个问题,我想要像

1,2,3.
这样的订单。顺序..

sql postgresql
2个回答
4
投票

这就是序列的工作方式。

重要提示:避免阻塞获取的并发事务 来自同一序列的数字,nextval 操作永远不会滚动 后退;也就是说,一旦获取了一个值,它就被视为已使用,并且 不会再被退回。即使周围环境也是如此 事务稍后中止,或者如果调用查询最终不使用 值。

正如评论中所指出的,序列中存在间隙并没有什么坏处。如果您出于某种原因删除了表中的某些行,则会在主键值中创建间隙,并且您通常不会费心重置它们以使它们保持顺序。

如果您坚持创建无间隙序列,请阅读本文:https://web.archive.org/web/20180110111154/http://www.varlena.com/GeneralBits/130.php并做好缓慢的准备插入。


2
投票

在生成这种类型的人工主键时,重要的是要清楚地了解主键的值没有任何意义。我将再次强调这一点 - 密钥的值没有任何意义,并且开发人员、经理或用户赋予它的任何“含义”都是不正确的。它是一个唯一的、非空的且不变的值——就是这样。数字是多少并不重要。相对于表中的其他键是否处于某种“顺序”并不重要。不要陷入相信这些值需要排序、需要增加或必须以某种其他方式符合“它们应该看起来如何”的某些外部期望的陷阱。

独一无二。非空。不变。这就是您所知道的一切,也是您需要知道的一切。

祝你好运。

© www.soinside.com 2019 - 2024. All rights reserved.