SQL Server唯一GUID

Jor*_*dan 5 t-sql sql-server

我理解在SQL Server中GUID是最独特的,并且碰撞的可能性很小,但同时有人必须赢得彩票,所以我觉得为这种可能性做准备是有道理的.

这是更快/更好的做法

使用一种技术,我只需插入一行并检查错误(@@ ERROR <> 0)直接分配一个新的GUID,然后重复直到我没有得到错误[我认为理论上最坏的只是一次...]

或使用这样的方法

DECLARE @MyGUID uniqueidentifier
SELECT @MyGUID = NewID()
if exists(select * from tablename where UserID=@MyGUID)
Run Code Online (Sandbox Code Playgroud)

并循环,直到我发现一个没有使用.

我喜欢第二种方法,因为我可以在后面的存储过程中使用GUID,所以我现在倾向于那个.

Rem*_*anu 7

如果您的计算机中至少有一个网络适配器,那么您的GUID将是唯一的.如果你没有,那么理论上存在与另一台机器上产生的guid相撞的可能性,但永远不会发生在你身上.编写代码以防止重复的guid是完全浪费时间.

话虽这么说,通过一种方法来强制关系数据库中任何事物的唯一性:在数据上创建一个唯一的约束:

ALTER TABLE tablename ADD CONSTRAINT uniqueUSerID UNIQUE UserID;
Run Code Online (Sandbox Code Playgroud)

  • 据我所知,Windows API不再使用MAC地址来创建GUID(它现在基本上只是随机),而SQL Server使用顺序算法来处理索引群集问题. (3认同)

Ode*_*ded 5

在您的计算机上发生碰撞的可能性远小于您赢得彩票的可能性.

使用NEWID()并且不要担心极不可能发生的事件.

如果您将列声明为唯一,则无论如何都不会保留该列.

  • @Musigenesis:这几乎让我想起了Hitchhiker银河系指南中的*Improbability驱动*:-) (3认同)

Kyr*_*yro 4

实际回答问题,而不是争论问题/感知到的问题的优点。

您想要使用第一个实现,原因有两个:

  • 在对您处理的每条记录进行插入之前运行检查,最终会导致更多的资源专用于极不可能发生的事情。(数据库也将确保对列的约束,因此如果确实发生冲突,则不会提交数据)
  • 如果第一个错误,您可以花一点额外的时间来处理返回的错误。

您可以将两者结合起来并声明新的 uniqueidentifier 插入到表中(如果它有效,请继续使用它,否则使用新的重试,然后继续使用它)。

通常,您希望首先针对最可能的情况进行编程,然后最后处理异常。