当用于唯一ID时,我在NEWID()上阅读了不少文章和SO帖子。我正在尝试在创建复合主键时找出该函数是否适合我的记录。
引起我注意的是那些以某种方式操纵NEWID()来生成唯一ID的人。然而,问题来到我的。当您在下面的示例中操作NEWID()时,ID是否仍然遵循相同的原则:独特或只是随机?
RIGHT('000000000' + CAST(ABS(CHECKSUM(NEWID())) % 999999999 AS VARCHAR(9)), 9)
这样做的目的是将上述结果与客户ID结合在一个表中,该表具有重复的客户ID和没有客户ID的记录(即:0作为ID)。例如,上面的代码与客户ID一起使用:
New ID - 49302304954983 (Customer with 49302 ID)
New ID - 0480384348 (Customer with 0 ID)
通过这种方式,我可以快速识别具有原始ID和没有ID的客户。然后我可以使用新的复合键作为记录唯一的主键。
感谢您的协助。我仍然有很多东西要学习正确的数据库开发,我正在努力保持简单和合理的良好实践。请不要犹豫,就这种分配新主键的方法提出意见。如果可能的话,我会在回答问题时欢迎所有反馈的好坏。 :)
答案 0 :(得分:3)
NEWID()
将是唯一的,但结果不会是唯一的。 NEWID()
是36个字符。这是使用校验和,这是一个高达约40亿的值,然后将其转换回一系列数字。
此表达式的可能值有NEWID()
个值。通过称为pigeonhole principle的东西,会有重复的值。
答案 1 :(得分:0)
你的表达式中有CHECKSUM(NEWID()))。
NewID()本身保证是唯一的。但是,一旦你拿走CheckSum,你就不能再保证唯一性了。
Checksum是一个哈希函数。散列函数具有较低的冲突概率,但不保证唯一性。