是否有其他策略可用于自动递增主键?因此,不是通常的x + n,其中n是1,可能是其他数字,如5?或者也许是一个随机数,但下一个ID仍然是唯一的?
我不确定它的用途是什么,或者即使这是一个好主意,我只是好奇。
答案 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字段。这些都有自己的问题和问题,但在进行这样的设计之前,你应该深入阅读它们。