NEWID()
函数是否从未给我提供与之相同的ID?假设我选择NEWID()
并返回'1'(仅作为示例)。它永远不会再回归'1'吗?这不可能吗?
答案 0 :(得分:17)
NEWID()
和NEWSEQUENTIALID()
都提供了uniqueidentifier
类型的全局唯一值。
NEWID()
涉及随机活动,因此下一个值是不可预测的,执行速度较慢。
NEWSEQUENTIALID()
不涉及随机活动,因此the next generated value can be predicted(不容易!)并且执行速度超过NEWID()
。
因此,如果您不关心预测的下一个值(出于安全原因),您可以使用NEWSEQUENTIALID()
。如果您担心可预测性,或者您不介意微小的性能损失,可以使用NEWID()
。
但是,从严格意义上讲,不同机器生成的GUID具有相同值的可能性微乎其微。在实践中,它被认为是不可能的。
如果您想了解更多信息,请阅读:Which method for generating GUIDs is best for ensuring the GUID is really unique?
注意NEWID()
符合RFC 4122。另一个函数使用Microsoft的算法来生成值。
答案 1 :(得分:7)
如果您在同一台计算机上运行NEWID()
,则返回值将始终是唯一的,因为它在计算中包含当前时间戳。
然而,在不同的机器/系统上,您可以技术获得相同的ID,但发生这种情况的可能性非常低,以至于今天的SQL DB社区基本上已经接受了它是不可能的。微软已经或多或少地在其上树立了声誉。
相关
答案 2 :(得分:3)
我有同样的问题,所以我运行这个简单的查询来查看newid()的独特之处,因为你会发现即使在同一个毫秒内也没有重复的ID:
do {
FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);
res = select(maxfd + 1, &readfds, NULL, NULL, &tv);
tv.tv_sec = 5;
tv.tv_usec = 0;
time_t waiting;
time(&waiting);
if (difftime(waiting, current) >= 5) {
//do something
}
} while (res < 0);
您可以根据需要定义@TRIES。