【问题标题】:Primary key auto-increment manipulation主键自增操作
【发布时间】:2015-09-03 06:51:33
【问题描述】:

有什么方法可以让主键具有增加主键但填补空白的功能?假设我有下表:

____________________
| ID  |    Value    |
|  1  |      A      |
|  2  |      B      |
|  3  |      C      |
^^^^^^^^^^^^^^^^^^^^^

注意,数值只是一个例子,顺序与问题无关。

一旦我删除了 ID 为 2 的行(表格将如下所示):

____________________
| ID  |    Value    |
|  1  |      A      |
|  3  |      C      |
^^^^^^^^^^^^^^^^^^^^^

我添加了另一行,具有常规自动增量功能,它看起来像这样:

____________________
| ID  |    Value    |
|  1  |      A      |
|  3  |      C      |
|  4  |      D      |
^^^^^^^^^^^^^^^^^^^^^

正如预期的那样。

我想要的输出是:

____________________
| ID  |    Value    |
|  1  |      A      |
|  2  |      D      |
|  3  |      C      |
^^^^^^^^^^^^^^^^^^^^^

空白处用新行填充。另请注意,在记忆中,它可能看起来会有所不同。但关键是主键会填补空白。

当有主键时(例如)1, 2, 3, 6, 7, 10, 114应该先填,然后58等等......当表为空时(即使它有一个百万行之前)它应该从 1 重新开始。

我该如何做到这一点?有没有类似的内置功能?我可以实现吗?

编辑:如果不可能,为什么不呢?

【问题讨论】:

  • 没有。也不要自己做。你需要它做什么?
  • 没有真正的理由这样做。自动生成的 ID 的唯一目的是唯一,并且 bigints(或您使用的任何东西)可以上升到如此巨大的值,如果您担心的话,您永远没有机会达到极限。
  • @juergend 它可以简化许多操作,例如使用 id 生成随机行(带有内置随机函数,如 Random.Next()rand())。
  • PK 的随机生成器不是一个好主意,它会导致页面拆分和重新排序,影响性能和存储。 PK 在按顺序插入时是最佳的。

标签: sql sql-server


【解决方案1】:

不,正如 juergen-d 所说,你不想那样做。它不太可能做你认为它正在做的事情,而且在多用户环境中它会做的更少。 在多用户环境中,即使没有删除,您也可能会因为中止的插入而出现空白。

【讨论】:

  • 没错。如果我没记错的话,随着数据库的增长,跟踪这样的“漏洞”也会变得非常低效/繁琐,尤其是在频繁删除的环境中。
  • 我想如果一个人真的接受了这样的想法,可以简单地删除第 2 列中的值,然后编写一个自定义插入来运行全表扫描并将“新”值插入空白位置,即不会比 O(n) 多多少,除了多个用户会使它更复杂。仍然没有看到好处。
  • 这肯定会在并发场景中中断。
猜你喜欢
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 2012-07-31
  • 1970-01-01
相关资源
最近更新 更多