Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql表中主键id之间的间隙_Sql_Postgresql - Fatal编程技术网

sql表中主键id之间的间隙

sql表中主键id之间的间隙,sql,postgresql,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 t

我有一张桌子是:

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;
当我对insert发出错误请求时,就像对unique列使用相同的值一样。“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.
这样的订单。顺序..

这是工作方式

要点:避免阻止获得 来自同一序列的数字,不会滚动下一个操作 返回也就是说,一旦获取了一个值,它就被视为已被使用,并且 将不再返回。即使周围环境 事务稍后会中止,或者如果调用查询最终没有使用 价值

正如评论中所指出的,在序列中存在间隙并无害处。如果您删除了表中的某些行,无论是出于什么原因,您都会在主键值中创建间隙,而您通常不会费心重新设置它们以使它们连续


如果您坚持创建无间隙序列,请阅读本文:并做好缓慢插入的准备。

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

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


祝你好运。

这就是序列的工作原理。生成的主键值之间的间隙没有问题。您不需要做任何事情,一切都很好。为什么不使用
串行
@HoneyBadger:a
串行
也会做同样的事情thing@HoneyBadger你评论的措辞表明这些东西是不同的,而这实际上是一个
serial
列(它明确地做了
serial
在引擎盖下所做的事情)@HoneyBadger:如果您创建一个带有
序列号的表,然后使用
pg_dump
获取其定义,它将实际输出问题中的SQL代码<代码>串行
只是一个宏。但这不是问题的关键。
人工主键
=
代理键