当前位置: 首页 > 面试题库 >

Postgresql SERIAL的工作方式是否有所不同?

南门英飙
2023-03-14
问题内容

我有一个带有序列ID的postgres表。

id (serial) name age

插入通常发生在Web应用程序中。

我手动插入了两个新记录,将id设置为max(id)+1 ****

在这2次插入之后,当Web应用程序插入2条记录时,它会给出重复的键错误。

仅用于2条记录。之后,一切正常。

问题是-为什么我的手动插入没有增加序列号?

自动递增和串行是否不同?

我在这里想念什么?MySQL或任何其他SQL是否存在相同的问题?


问题答案:

创建serialor或bigserial column时,PostgreSQL实际上会执行三件事:

  1. 创建一个intbigint列。
  2. 创建一个序列(由列拥有)以生成该列的值。
  3. 将列的默认值设置为序列的nextval()

当您插入一个不指定serial列的值(或者如果您明确指定DEFAULT为其值)时,nextval将在序列上调用以:

  1. 返回该列的下一个可用值。
  2. 增加序列的值。

如果您手动为该serial列提供非默认值,则该序列将不会更新,并且nextval可以返回该serial列已使用的值。因此,如果您执行这种操作,则必须通过调用nextvalsetval手动修复序列。

还请记住,可以删除记录,因此serial可以预料到列之间的间隔,因此max(id) + 1即使没有并发问题,使用也不是一个好主意。

如果您使用serialbigserial,最好的办法是让PostgreSQL为您分配值,并假装它们是不透明的数字,而这些数字恰好以一定顺序出现:不要自己分配它们,也不要这样做。除了唯一性之外,不要对它们承担任何其他责任。此经验法则适用于所有数据库IMO。

我不确定MySQL如何auto_increment与所有不同的数据库类型一起工作,但也许好的手册会有所帮助。



 类似资料:
  • 问题内容: 我想将日期字符串转换为javascript,请使用以下代码: 是服务器中JSON对象中的UTC时间。 但是以上代码的结果在Firefox和Chrome之间是不同的: Firefox返回: Chrome返回: 1天不一样,我期望的正确结果是Chrome的结果。 如何解决此问题,以便从两者获得相同的结果? 问题答案: UTC的正确格式为(Z为祖鲁时间)。如果不存在,则追加以获取正确的UTC

  • 问题内容: 我已经成功使用javax.crypto.Cipher.getInstance(“ DESede / CBC / NoPadding”)在Android上通过DESFire卡进行身份验证 。它可以在Android 4到5的多种设备上运行,但是在我更新为6棉花糖(和6.0.1)的Nexus 7上停止了工作。在更新之前,它一直在同一设备上工作。 似乎Cipher的工作方式不同,对于相同的密钥

  • 问题内容: 如果Java中没有编译时绑定,是否意味着所有绑定都在运行时完成? 但是,按照OOP的运行时绑定概念,函数必须具有virtual关键字。.是否所有方法在Java中都是隐式虚拟的,还是Java中存在任何编译时绑定? 如果有任何编译时约束,您能给我一些具体情况,还是链接到更多信息 静态的(这里没有绑定的含义,因为静态不属于对象) 最终的(这不是有效点,因为可以通过其他方式实现) 问题答案:

  • 问题内容: 在C#中,您可以使用属性使数据字段可公开访问(允许用户直接访问它),但仍保留对那些直接访问的字段执行数据验证的功能。Java是否有类似的东西?对于实例,假设存在一个具有以下实现的C#类(请参见下文): 在该类中的此定义允许用户在从数据字段“ x”中检索值并为其分配值时“自然”使用数据字段“ x”。以下是它在main中的用法。 问题是… java也可以做到这一点吗?如果是这样,它叫什么?

  • 问题内容: 我正在尝试使用大型Python应用程序调试内存问题。大部分内存在Python类管理的数组中,因此Heapy等无用,因为它们不占数组中的内存。因此,我尝试使用MacOSX(10.7.5)活动监视器(或者如果愿意)来手动跟踪内存使用情况。我注意到以下奇怪的行为。在普通解释器外壳(2.7.3)上: 不管我做什么,Python会话的内存占用都不会再低于134.9 MB。所以我的问题是: 为什么

  • 我想检测中的选择何时更改。不是在单击菜单项时,而是在选择(武装)菜单项时。用更简单的话,我想检测到这一点: 应该起作用的是将添加到其中,但它似乎不响应选择事件: 我尝试的第二件事是使用,但它也不起作用(不检测此特定事件): 在XY问题的情况下,我的最终目标是在用户使用箭头按钮更改菜单的选择时适当地增加/减少该滚动条: