我对postgresql序列有疑问。
例如,对于bigserial数据类型,序列是否正确,然后检索数字,即使插入/提交不成功,序列也不会回溯。这意味着下次我可能会对表进行插入,这可能是序列号中的间隙。
在我的桌子上使用psycopg2插入行触发器之前有一个。
提前感谢。
答案 0 :(得分:4)
即使插入/提交是 没有成功,序列没有 回溯。这意味着下次我可能会对表进行插入,这可能是序列号中的间隙。
是的,那是真的,那没关系。 人们通常希望序列在表中获取唯一的值(通常用于PK) 和差距根本不重要。
如果你很好奇:如果考虑并发,这是很自然的行为。假设事务T1插入一行,从序列中获取PK1,使用该值在其他表中构建另一个记录...同时(在T1提交之前)另一个事务T2在同一个表中插入一行。然后T1回滚和T2提交......
顺便说一下:如果你想要一个“无间隙”的序列......首先问问自己你是否真的想要(通常你真的没有 - 并且要求经常指出你设计中的概念问题)......但如果你真的需要它,你可以阅读this。答案 1 :(得分:3)
回溯需要锁定直到完成。这将是不好的,特别是当10个表都可以使用相同的序列时。如果您想要订单,请不要使用序列,请使用像row_number()这样的窗口函数。