操纵NEWID()仍然使它独一无二吗?

时间:2014-01-16 03:41:32

标签: sql sql-server database tsql database-design

当用于唯一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的客户。然后我可以使用新的复合键作为记录唯一的主键。

感谢您的协助。我仍然有很多东西要学习正确的数据库开发,我正在努力保持简单和合理的良好实践。请不要犹豫,就这种分配新主键的方法提出意见。如果可能的话,我会在回答问题时欢迎所有反馈的好坏。 :)

2 个答案:

答案 0 :(得分:3)

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

此表达式的可能值有NEWID()个值。通过称为pigeonhole principle的东西,会有重复的值。

答案 1 :(得分:0)

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

NewID()本身保证是唯一的。但是,一旦你拿走CheckSum,你就不能再保证唯一性了。

Checksum是一个哈希函数。散列函数具有较低的冲突概率,但不保证唯一性。