我注意到当我删除一个用户(例如id = 6的用户)然后我添加新用户时,新用户没有插入id = 6(我说的是左边的第一列调用pgadmin“id PK Serial”)所以基本上我有很多漏洞,因为在我的训练中我经常删除并添加用户.
所以我最终得到了id列:id = 1,id = 5,id = 9 id = 10 ……很多洞.
有关系吗?它可能会影响我以后需要做的db请求吗?
如果我需要更正并强制db“填充”所有id插槽,我应该怎么做?
解决方法
根据设计,Postgresql序列不受正常事务规则的约束.如果它们不是那么一次只有一个事务可以获取一个ID,那么你一次就不能有多个会话插入一个表.这将导致悲惨的表现.
这在the PostgreSQL manual on the nextval
call中解释 – 从序列中获取值的调用:
Important: To avoid blocking concurrent transactions that obtain
numbers from the same sequence,a nextval operation is never rolled
back; that is,once a value has been fetched it is considered used,
even if the transaction that did the nextval later aborts. This means
that aborted transactions might leave unused “holes” in the sequence
of assigned values.
从理论上讲,Postgresql可以维护已删除,已弃用和未使用的ID列表,但实际上,这在性能方面非常昂贵 – 并且极难实现.一旦应用程序获得了nextval的id,它就可以在将来的任何时候使用它,并且一些应用程序使用这种方法,缓存ID块以获得更好的内部并发性.
将生成的ID视为唯一的行号 – 这就是全部.它没有告诉你有多少行.它不会告诉您是否在另一行之后插入了一行(您可以使用created_time时间戳,可能由触发器维护).它不会告诉您是否在另一行之后提交了一行(系统xmin columm告诉您,具有某些限制).它告诉你的是如何找到行.
看到: