Thi*_*yão 5 postgresql uuid sql-order-by postgresql-9.4
在 postgresql 上使用 uuid_generate_v1() 是否有任何顺序保证?
如果是,则保证是每台机器,还是在哪台机器上生成 UUID 无关紧要?由于 V1 UUID 是按时间戳 + MAC 地址,Postgres 内部是否先按时间戳部分然后按 MAC 排序?
我可以通过 UUID 类型列“订购”并期望它始终有效(似乎有效)吗?
我想在多台机器上生成 UUID(使用 postgresql uuid_generate_v1()),将它们复制到一个 Postgres 实例,然后按 UUID 列排序。它必须保证机器的顺序,而不是所有机器的 UUID 的顺序。
虽然绝不是一个明确的答案 - 即。“该行为是在所有 PostgreSQL 安装中定义的吗?”此 SQL(对于 SQL Server)用于检查 GUID 中每个字节的顺序。可能需要对 PostgreSQL 进行一些调整。
生成这样的映射应该允许人们查看 PostgreSQL 中特定的 UUID 结构(明确定义的类型之一或其他类型)是否“以特定方式排序”。
With UIDs As (-- 0 1 2 3 4 5 6 7 8 9 A B C D E F
Select ID = 'F', UID = cast ('00000000-0000-0000-0000-000000000011' as uniqueidentifier)
Union Select ID = 'E', UID = cast ('00000000-0000-0000-0000-000000001100' as uniqueidentifier)
Union Select ID = 'D', UID = cast ('00000000-0000-0000-0000-000000110000' as uniqueidentifier)
Union Select ID = 'C', UID = cast ('00000000-0000-0000-0000-000011000000' as uniqueidentifier)
Union Select ID = 'B', UID = cast ('00000000-0000-0000-0000-001100000000' as uniqueidentifier)
Union Select ID = 'A', UID = cast ('00000000-0000-0000-0000-110000000000' as uniqueidentifier)
Union Select ID = '9', UID = cast ('00000000-0000-0000-0011-000000000000' as uniqueidentifier)
Union Select ID = '8', UID = cast ('00000000-0000-0000-1100-000000000000' as uniqueidentifier)
Union Select ID = '7', UID = cast ('00000000-0000-0011-0000-000000000000' as uniqueidentifier)
Union Select ID = '6', UID = cast ('00000000-0000-1100-0000-000000000000' as uniqueidentifier)
Union Select ID = '5', UID = cast ('00000000-0011-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '4', UID = cast ('00000000-1100-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '3', UID = cast ('00000011-0000-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '2', UID = cast ('00001100-0000-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '1', UID = cast ('00110000-0000-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '0', UID = cast ('11000000-0000-0000-0000-000000000000' as uniqueidentifier)
)
Select * From UIDs Order By UID desc
Run Code Online (Sandbox Code Playgroud)
在 SQL Server(2014,并与 SQL Server 2005 中的匹配)中,降序排列为:
With UIDs As (-- 0 1 2 3 4 5 6 7 8 9 A B C D E F
Select ID = 'F', UID = cast ('00000000-0000-0000-0000-000000000011' as uniqueidentifier)
Union Select ID = 'E', UID = cast ('00000000-0000-0000-0000-000000001100' as uniqueidentifier)
Union Select ID = 'D', UID = cast ('00000000-0000-0000-0000-000000110000' as uniqueidentifier)
Union Select ID = 'C', UID = cast ('00000000-0000-0000-0000-000011000000' as uniqueidentifier)
Union Select ID = 'B', UID = cast ('00000000-0000-0000-0000-001100000000' as uniqueidentifier)
Union Select ID = 'A', UID = cast ('00000000-0000-0000-0000-110000000000' as uniqueidentifier)
Union Select ID = '9', UID = cast ('00000000-0000-0000-0011-000000000000' as uniqueidentifier)
Union Select ID = '8', UID = cast ('00000000-0000-0000-1100-000000000000' as uniqueidentifier)
Union Select ID = '7', UID = cast ('00000000-0000-0011-0000-000000000000' as uniqueidentifier)
Union Select ID = '6', UID = cast ('00000000-0000-1100-0000-000000000000' as uniqueidentifier)
Union Select ID = '5', UID = cast ('00000000-0011-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '4', UID = cast ('00000000-1100-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '3', UID = cast ('00000011-0000-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '2', UID = cast ('00001100-0000-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '1', UID = cast ('00110000-0000-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '0', UID = cast ('11000000-0000-0000-0000-000000000000' as uniqueidentifier)
)
Select * From UIDs Order By UID desc
Run Code Online (Sandbox Code Playgroud)
由于 SQL Servernewsequentialid使用此顺序来生成索引友好的 GUID,因此该行为可能永远不会改变。SQL Server 还必须在所有系统上维护此行为以支持复制。因此,如果问题是关于 SQL Server 的,我肯定会说“SQL Server中GUID 的顺序是一致的”,这在SQL Server 中绝对可以信赖。
然而,这种排序与 .NET 的 GUID 排序不同,如果 PostgreSQL 中的排序不同,我也不会感到惊讶。SQL Server 中的“翻转”差异是因为它遵循COM GUID的“变体 2”(又名小端)排序;即使对于“变体 1”UUID 也是如此。(然而,为什么这些组本身是从右到左排序的,这似乎更随意:更多的微软历史?)
有趣的问题仍然存在:在PostgreSQL中在哪里/如何指定排序?如果没有明确规定,实现仍然可以被视为行为公理吗?
另请参阅此问题以获取有关 SQL Server UUID 的更多详细信息;以及“为什么”存在这些差异的有趣细节。
| 归档时间: |
|
| 查看次数: |
10052 次 |
| 最近记录: |