跨多个 SQL 服务器的唯一标识符

3
我正在开发一些软件,将在全国范围内的多个实例中使用。像大多数使用登录功能的软件一样,我需要为每个用户提供一个唯一的ID。每个软件实例都需要完全独立运行,但很有可能最终会合并几个数据库。在这种情况下,我希望每个用户的ID在所有服务器上都是唯一的。
由于服务器之间没有通信(它们只服务于局域网),因此我认为,从精确到毫秒的时间戳生成ID可能可行。对于仅有数千而不是数百万用户的用户池,一个用户在另一个服务器上创建的毫秒数相同的概率非常低。
是否真的有任何方法可以保证在没有服务器之间通信的情况下,在所有服务器上都具有唯一的ID呢?

http://en.wikipedia.org/wiki/Universally_unique_identifier - Brian Roach
4个回答

6

使用16字节的uniqueidentifier数据类型。

一个示例:

SELECT NEWID()
GO
-- This will return a new random uniqueidentifier e.g.
E75B92A3-3299-4407-A913-C5CA196B3CAB

在变量中选择此GUID

--assign uniqueidentifier in a variable
DECLARE @EmployeeID uniqueidentifier
SET @EmployeeID = NEWID()
You can directly use this with INSERT statement to insert new row in table.

-- 向员工表中插入数据。
INSERT INTO Employees
(EmployeeID, Name, Phone)
VALUES
(NEWID(), 'John Kris', '99-99999')

这些示例来自这里,如果您需要更多信息。


感谢提供这些优秀的链接和示例! - Indigenuity

5

是的,您可以通过使用自增ID轻松地实现这一点,这些ID按您拥有的服务器数量的倍数递增,但从不同的数字开始。

例如,如果您有3个数据库:

Server 1: IDs increment by 3 starting from 1 E.g. 1, 4, 7, 10
Server 2: IDs increment by 3 starting from 2 E.g. 2, 5, 8, 11
Server 3: IDs increment by 3 starting from 3 E.g. 3, 6, 9, 12

2
不同,但聪明的想法。你需要知道安装了多少个实例才能填写3,而且它们将是固定的。 - Doozer Blake
2
+1 因为这是一个有趣的想法,但是-1 是因为它在实现数量上极其有限。 - JNK
2
@BG100 是的,我明白。在某些时候,您可能会遇到规模问题。我猜这完全取决于 OP 所指的多个实例是什么意思。 - Doozer Blake
我可能最终会使用UUID,但我同意,一个简单的ID会非常好。我还考虑过使用安装软件时的某些变量(例如位置),并将其添加到每个服务器上递增值的末尾。感谢您提供的想法! - Indigenuity
1
@BrianRoach:“沿着路线把自己画进一个角落” - 我很难想象那是什么意思 ;) - onedaywhen
显示剩余6条评论

4

2

UUID(GUID)是最适合您的情况的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接