Roi Shabtai Asked: 2020-10-08 01:42:47 +0800 CST2020-10-08 01:42:47 +0800 CST 2020-10-08 01:42:47 +0800 CST 跨表的大标识符唯一性 772 我们NEWSEQUENTIALID用来生uniqueidentifier成为表ID。服务器重置后会引发问题,因为它的种子被修改并且顺序中断。 是否有另一种建议的解决方案来实现表的大标识符唯一性? 谢谢 sql-server uniqueidentifier 2 个回答 Voted Tibor Karaszi 2020-10-08T02:51:28+08:002020-10-08T02:51:28+08:00 也许看看吉米尼尔森的梳子?此处讨论:https ://stackoverflow.com/questions/1155454/performance-value-of-comb-guids 或者,如果您不需要多个 SQL Server 实例的唯一性,只需要一些具有序列或标识的 int 类型?(正如 Mo64 所建议的那样。) AFAIK,NEWSEQUENTIALID() 在重新启动时“重新播种”这一事实是我们无法阻止的。 Best Answer Hannah Vernon 2020-10-08T07:07:16+08:002020-10-08T07:07:16+08:00 永远不能保证生成的标识值、序列值和顺序唯一标识符值没有间隙。 话虽如此,如果您将NEWSEQUENTIALID()(or IDENTITY,甚至 a SEQUENCE) 用于主键列,那么您为什么要关心生成的值是否是连续的。只要它们是唯一的,并且保证是唯一的,那么这些值之间的差距有什么问题? 如果您以某种方式使用该值来确认正确的过程,例如发票编号,您必须保证每个编号都是连续的,那么您可能希望SEQUENCE使用不使用缓存的 a。 CREATE SEQUENCE dbo.my_sequence AS int START WITH -2147483647 INCREMENT BY 1 NO CYCLE NO CACHE; 该NO CACHE指令指示 SQL Server 从序列中一次生成一个数字,这会导致性能降低,但可以防止序列由于服务器关闭等而丢失数字。 由于我上面的序列定义使用了一种int数据类型,并且以 -2147483647 开头,因此它将在属性生成错误之前生成 4,294,967,296 个唯一数字NO CYCLE。如果删除该NO CYCLE属性,一旦达到 2147483648,序列将重置为 -2147483647。它的数值范围不够大,您始终可以使用 abigint作为数据类型。
也许看看吉米尼尔森的梳子?此处讨论:https ://stackoverflow.com/questions/1155454/performance-value-of-comb-guids
或者,如果您不需要多个 SQL Server 实例的唯一性,只需要一些具有序列或标识的 int 类型?(正如 Mo64 所建议的那样。)
AFAIK,NEWSEQUENTIALID() 在重新启动时“重新播种”这一事实是我们无法阻止的。
永远不能保证生成的标识值、序列值和顺序唯一标识符值没有间隙。
话虽如此,如果您将
NEWSEQUENTIALID()
(orIDENTITY
,甚至 aSEQUENCE
) 用于主键列,那么您为什么要关心生成的值是否是连续的。只要它们是唯一的,并且保证是唯一的,那么这些值之间的差距有什么问题?如果您以某种方式使用该值来确认正确的过程,例如发票编号,您必须保证每个编号都是连续的,那么您可能希望
SEQUENCE
使用不使用缓存的 a。该
NO CACHE
指令指示 SQL Server 从序列中一次生成一个数字,这会导致性能降低,但可以防止序列由于服务器关闭等而丢失数字。由于我上面的序列定义使用了一种
int
数据类型,并且以 -2147483647 开头,因此它将在属性生成错误之前生成 4,294,967,296 个唯一数字NO CYCLE
。如果删除该NO CYCLE
属性,一旦达到 2147483648,序列将重置为 -2147483647。它的数值范围不够大,您始终可以使用 abigint
作为数据类型。