SQL Server:NEWID()总是提供唯一的ID吗?

时间:2013-07-28 13:37:05

标签: sql sql-server database unique newid

NEWID()函数是否从未给我提供与之相同的ID?假设我选择NEWID()并返回'1'(仅作为示例)。它永远不会再回归'1'吗?这不可能吗?

3 个答案:

答案 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。