有一种方法可以让主键 id 没有任何间隙

Wat*_*nki 0 sql database oracle primary-key sequential

我正在使用 Java Spring 和 Oracle DB 创建一个应用程序。

在应用程序中,我想生成一个唯一且有序且没有间隙的主键值:1,2,3,4,5而不是1,2,5,7,8,9.

我曾一度用于max(id) + 1获取 id 的最大值以及下一个/当前事务的 id。但是我知道在多个用户或多个会话并发的情况下它并不完美。

我尝试过使用序列,但即使使用标签,ORDER它仍然可能会产生间隙,从而可能导致事务失败。

REATE SEQUENCE num_seq 
START WITH 1 
INCREMENT BY 1 
ORDER NOCACHE NOCYCLE;
Run Code Online (Sandbox Code Playgroud)

我需要有无间隙的值作为要求,但是我不确定在多个用户/多个会话的情况下如何可能。

The*_*ler 7

不要这样做。

主键的目标不是显示在 UI 上或暴露给外部世界,而只是提供行的唯一标识符

简而言之,主键不需要很性感或好看。这是一个内部标识符。

如果您正在考虑使用序列标识符的想法,这意味着您可能希望将其显示在某个地方或者希望将其暴露给外部世界。如果是这样的话,那么创建一个辅助列(也是唯一的)来服务于这个“公共关系”目标。它可以自动生成,也可以随意更新,而不影响数据库的完整性。

它还可以由以延迟方式(例如每 10 分钟)运行的辅助进程生成,该进程查找所有“未分配”的新行,并为它们提供新的编号。这样做的好处是不容易受到并发的影响。