Postgresql SERIAL的工作方式是否有所不同?
我有一个带有序列ID的postgres表。
id (serial) name age
插入通常发生在Web应用程序中。
我手动插入了两个新记录,将id设置为max(id)+1 ****
在这2次插入之后,当Web应用程序插入2条记录时,它会给出重复的键错误。
仅用于2条记录。之后,一切正常。
问题是-为什么我的手动插入没有增加序列号?
自动递增和串行是否不同?
我在这里想念什么?MySQL或任何其他SQL是否存在相同的问题?
回答:
创建serial
or或bigserial
column时,PostgreSQL实际上会执行三件事:
- 创建一个
int
或bigint
列。 - 创建一个序列(由列拥有)以生成该列的值。
- 将列的默认值设置为序列的
nextval()
。
当您插入一个不指定serial
列的值(或者如果您明确指定DEFAULT
为其值)时,nextval
将在序列上调用以:
- 返回该列的下一个可用值。
- 增加序列的值。
如果您手动为该serial
列提供非默认值,则该序列将不会更新,并且nextval
可以返回该serial
列已使用的值。因此,如果您执行这种操作,则必须通过调用nextval
或setval
手动修复序列。
还请记住,可以删除记录,因此serial
可以预料到列之间的间隔,因此max(id) + 1
即使没有并发问题,使用也不是一个好主意。
如果您使用serial
或bigserial
,最好的办法是让PostgreSQL为您分配值,并假装它们是不透明的数字,而这些数字恰好以一定顺序出现:不要自己分配它们,也不要这样做。除了唯一性之外,不要对它们承担任何其他责任。此经验法则适用于所有数据库IMO。
我不确定MySQL如何auto_increment
与所有不同的数据库类型一起工作,但也许好的手册会有所帮助。
以上是 Postgresql SERIAL的工作方式是否有所不同? 的全部内容, 来源链接: utcz.com/qa/424701.html