创建
serialor或
bigserialcolumn时,PostgreSQL实际上会执行三件事:
- 创建一个
int
或bigint
列。 - 创建一个序列(由列拥有)以生成该列的值。
- 将列的默认值设置为序列的
nextval()
。
当您插入一个不指定
serial列的值(或者如果您明确指定
DEFAULT为其值)时,
nextval将在序列上调用以:
- 返回该列的下一个可用值。
- 增加序列的值。
如果您手动为该
serial列提供非默认值,则该序列将不会更新,并且
nextval可以返回该
serial列已使用的值。因此,如果您执行这种操作,则必须通过调用
nextval或
setval手动修复序列。
还请记住,可以删除记录,因此
serial可以预料到列之间的间隔,因此
max(id) + 1即使没有并发问题,使用也不是一个好主意。
如果您使用
serial或
bigserial,最好的办法是让PostgreSQL为您分配值,并假装它们是不透明的数字,而这些数字恰好以一定顺序出现:不要自己分配它们,也不要这样做。除了唯一性之外,不要对它们承担任何其他责任。此经验法则适用于所有数据库IMO。
我不确定MySQL如何
auto_increment与所有不同的数据库类型一起工作,但也许好的手册会有所帮助。



