为什么PostgreSQL的自增ID是非连续的?

cevin 发布于 2015/06/02 03:15
阅读 1K+
收藏 0

while(1)插入数据。id为自增,结果 select * from test order by id  limit 100。得到的结果,id时非连续的,是这样的:


id account
1
4381382801
2
6753483210
3
6792862667
4
8257048078
5
5929138260
60
1875966564
93
3297039555
152
2393020508
153
7221914604
169
4837595955
253
9515850991
262
561485920
273
3943360816
283
7590868701
327
3647114597
344
8204110739
加载中
0
mark35
mark35
@cevin : 你是不是使用了事务?pgsql的sequence发生器不支持回滚,有可能是插入时新序列号已经获取但写入请求失败
mark35
mark35
回复 @cevin : 看看pg_log下面日志是否有插入失败
cevin
cevin
并没有使用事物,就是单纯的一个死循环不停的插入数据而已。
甘薯
甘薯
这个回答靠谱
0
旧城的骁珖
旧城的骁珖
select * from test order by id ASC  limit 100 
甘薯
甘薯
如果不加ASC 默认就是ASC的.
0
红星xx
红星xx
我记得 pgsql 手册 说过 ,你不指定 排序 ,pgsql 不保证 值 是顺序的 ,可能是 磁盘上的顺序
cevin
cevin
回复 @红星xx : 我的问题是order by id asc出来的结果ID却不是连续的。。。。.
cevin
cevin
回复 @mark35 : 我的问题是order by id asc出来的结果ID却不是连续的。。。。
mark35
mark35
手册上说的意思是如果没有ORDER BY排序,那么输出字段顺序是未知的。不过楼主已经指定了ORDER BY id,那么默认就是在id字段上做ASC排序。
红星xx
红星xx
回复 @cevin : 就是楼上的回答啊 ,order by 你要指定 ,直接 select 不保证顺序
cevin
cevin
如何指定排序?建表的时候确实没有指定排序
0
梦想岛
梦想岛

就像mysql 的uuid一样,每次select nextval('user_seq')都会自动递增的。就像楼主所说,可能你的事务没成功,但seq不会回滚,除非你rockback的时候设置一下seq

INSERT INTO my_users(u_id,u_name)VALUES(nextval('user_seq'),'oschina');

返回顶部
顶部