操纵NEWID()仍然使其唯一吗



当用于Unique ID时,我在NEWID()上读过不少文章和SO文章。在创建复合主键时,我正试图找出该函数是否适合我的记录。

吸引我眼球的是那些以某种方式操纵NEWID()生成唯一ID的人。然而,问题来了。当您在下面的例子中操作NEWID()时,ID是否仍然遵循唯一性或随机性的相同原则?

RIGHT('000000000' + CAST(ABS(CHECKSUM(NEWID())) % 999999999 AS VARCHAR(9)), 9)

这样做的目的是将上述结果与表中的客户ID相结合,该表具有重复的客户ID和没有客户ID的记录(即:0 as there ID)。例如,上面的代码与客户ID:一起使用

New ID - 49302304954983 (Customer with 49302 ID)
New ID - 0480384348 (Customer with 0 ID)

这样,我可以快速识别有原始ID的客户和没有ID的客户。然后,我可以使用新的复合密钥作为记录唯一的主键。

谢谢你的帮助。关于正确的数据库开发,我还有很多东西需要学习,我正在努力保持简单合理的良好实践。请毫不犹豫地就这种分配新主键的方法提供意见。如果可能的话,除了回答我的问题之外,我欢迎所有好的或坏的反馈。:)

NEWID()是唯一的,但结果不是。NEWID()是36个字符。这是使用校验和,这是一个高达约40亿的值,然后将其转换回一系列数字。

NEWID()的值远远多于此表达式的可能值。根据所谓的鸽子洞原理,会有重复的值。

表达式中有CHECKSUM(NEWID())。

NewID()本身保证是唯一的。但是,一旦对其进行校验和,就不能再保证其唯一性。

校验和是一个散列函数。哈希函数发生冲突的概率很低,但不能保证唯一性。

最新更新