【问题标题】:postgreSQL consecutive serial [duplicate]postgreSQL连续串行[重复]
【发布时间】:2014-06-24 09:49:17
【问题描述】:

我想在 ID 字段中保留逻辑自动增量。

它被定义为 SERIAL,但是一旦我删除一行(例如:15)然后插入一个新行,ID 就变为 16(因此,它从 14 跳到 16)。最好的处理方法是什么?

【问题讨论】:

标签: sql postgresql


【解决方案1】:

最好的处理方法是什么?这很简单。忽略这个非问题。

serial 数据类型保证放入一个自动递增的值。它不能保证其他很多。因此,间隙是允许的,它们确实会出现——例如,作为删除的结果。这是一件的事情。串行列的主要目的是创建主键。主键唯一标识每一行,整数数据类型便于将表连接在一起。没有理由在此过程中更改值。

如果您想要一个自动递增的顺序值,请使用 row_number() 在输出中获取您想要的内容:

select t.*,
       row_number() over (order by id) as MySequentialValueWithNoGaps
from table t

【讨论】:

  • 我知道在功能上是没有问题的。但是当你只有 6 行时设置一个 SELECT WHERE ID=220(删除之前应用的位置)听起来很奇怪......
  • 谁在乎这听起来很奇怪?数据库用的是 SQL,反正不是健全的……
  • @user1249791:如果这看起来很“奇怪”,那么你还没有理解主键的概念。
  • 嗯,在我看来,SQL 查询应该有一种人类逻辑。 ID=220 听起来好像有 220 条记录。即使它有效,对我来说听起来很奇怪。
  • 可能有一千万行,谁知道呢?那么其他表中的值呢?你不知道,你也不在乎。它只是一个用于标识唯一行的数字。或者当您只删除一张表中的一条记录时,您真的想更新数据库中的每一行吗?仍在使用旧 id 的每个人也很不幸:他们不知道该记录的新编号,因此无法再找到数据。
猜你喜欢
  • 2018-08-11
  • 1970-01-01
  • 2016-12-09
  • 2022-01-12
  • 2012-09-20
  • 2021-10-12
  • 2020-03-30
  • 2015-01-26
  • 1970-01-01
相关资源
最近更新 更多