我有一个关于 postgresql 序列的问题。
例如,对于 bigserial 数据类型,序列是否提前,然后检索数字,即使插入/提交不成功,序列也不会回溯。这意味着下次我可能要插入表时,这可能是序列号中的一个间隙。
在我的表上有一个插入行前触发器,我正在使用 psycopg2。
提前致谢。
我有一个关于 postgresql 序列的问题。
例如,对于 bigserial 数据类型,序列是否提前,然后检索数字,即使插入/提交不成功,序列也不会回溯。这意味着下次我可能要插入表时,这可能是序列号中的一个间隙。
在我的表上有一个插入行前触发器,我正在使用 psycopg2。
提前致谢。
即使插入/提交不成功,序列也不会回溯。这意味着下次我可能要插入表时,这可能是序列号中的一个间隙。
是的,这是真的,这很好。人们通常想要一个序列来获取表中唯一的值(通常用于 PK),并且间隙根本不重要。
如果你很好奇:如果考虑到并发性,这是很自然的行为。假设事务 T1 插入一行,从序列中获取 PK1,使用该值在其他表中构建另一个记录......同时(在 T1 提交之前)另一个事务 T2 在同一个表中插入一行。然后 T1 回滚和 T2 提交......
顺便说一句:如果你想要一个“无间隙”序列......首先问问自己是否真的想要那个(通常你真的不想要 - 并且经常要求你的设计中存在概念问题)......但是如果你真的需要,可以看这个。
回溯需要锁定直到完成。这会很糟糕,尤其是当 10 个表都可以使用相同的序列时。如果您想要订单,请不要使用序列,请使用诸如row_number()之类的窗口函数。