sql表中主键id之间的差距

时间:2016-08-23 11:27:50

标签: sql postgresql

我有一张表:

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.。顺序..

2 个答案:

答案 0 :(得分:2)

当生成这种类型的人工主键时,重要的是要清楚地理解主键的值没有意义。我将再次强调这一点 - 关键的价值没有意义,开发人员,经理或用户赋予它的任何“含义”都是错误的。这是一个独特的,非空的,不变的价值 - 就是这样。数字是什么并不重要。如果它相对于表中的其他键处于某种“顺序”并不重要。不要陷入相信这些价值需要被订购,需要增加,或者必须以某种其他方式符合某些外部期望“他们应该如何看待”的陷阱。

独特的。非空。不变。这就是你所知道的,而且你需要知道的一切。

祝你好运。

答案 1 :(得分:1)

这是sequences的工作方式。

  

重要说明:避免阻止获取的并发事务   来自相同序列的数字,从不滚动nextval操作   背部;也就是说,一旦获取了一个值,就会被认为是使用过的   将不会再次退回。即使周围也是如此   事务稍后中止,或者如果调用查询最终没有使用   价值。

正如评论中指出的那样,在序列中存在差距并没有坏处。如果您删除表格中的某些行,原因是您在主键值中创建了间隙,并且您通常无需重置它们以使其顺序。

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