除了默认的x + 1之外,还有其他可用于自动递增主键的策略吗?

时间:2009-07-29 16:17:25

标签: database primary-key

是否有其他策略可用于自动递增主键?因此,不是通常的x + n,其中n是1,可能是其他数字,如5?或者也许是一个随机数,但下一个ID仍然是唯一的?

我不确定它的用途是什么,或者即使这是一个好主意,我只是好奇。

5 个答案:

答案 0 :(得分:2)

在T-SQL(MS SQL Server)中,您使用IDENTITY property

IDENTITY [(种子,增量)]

种子是用于第一行加载到表格中的值。

增量是添加到已加载的上一行的标识值的增量值。“

你真正不应该做的一件事是尝试自己动手,除非你真的知道你在做什么,并且可以处理并发等。

编辑:为什么你需要小心:

这是一些伪SQL,显示使用自己的增量等的危险:

1. @NextID = SELECT MAX(ID) FROM MyTable;

2. INSERT INTO MyTable(ID + 1, Name) VALUES (@NextID, "Dan");

现在,在大多数情况下,这可行。但是,在高容量数据库中,总是有可能在步骤1和2之间发生另一个插入语句。然后,您最终会遇到主键冲突和错误。它可能不会经常发生,但是当它发生时,精确定位会很痛苦。

解决这个问题的方法是在步骤1之前使用LOCK并在步骤2之后释放它。这有效地排队所有事务,数据库以“单用户”模式运行。在大批量系统中,这可能对性能非常不利。

这就是为什么所有主要数据库都有序列或内置方法来自动增加主键。

答案 1 :(得分:1)

对于MySQL中的Master-Master复制,重要的是让不同的服务器具有完全独立的自动增量,以避免冲突。

通过为每个服务器指定偏移量和增量来使密钥保持独立。例如,

auto_increment_increment= 2
auto_increment_offset   = 2

答案 2 :(得分:1)

我们还为主/主复制情况使用不同的增量方案。我想我们有一台服务器正在计数,另一台倒计时。偶数/奇数也完全有效。

答案 3 :(得分:0)

取决于您正在使用的RDBMS。在oracle中就是这样(假设您为主键设置了一个触发器):

SQL> create sequence fun_seq
     start with 8
     increment by 2;

答案 4 :(得分:0)

对于随机ID(以及可以在服务器之间设置唯一的ID),您可以使用GUID字段而不是int字段。这些都有自己的问题和问题,但在进行这样的设计之前,你应该深入阅读它们。