首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PostgreSQL中按UUID排序是如何工作的?

问在PostgreSQL中按UUID排序是如何工作的?
EN

Stack Overflow用户
提问于 2017-04-06 02:24:44
回答 2查看 11.2K关注 0票数 5

在postgresql上使用uuid_generate_v1()有顺序保证吗?

如果是,tThe保证是每台机器,还是在哪台机器上生成UUID无关紧要?由于Postgres UUID是按时间戳+ V1地址排序的,Postgres内部是否先按时间戳部分排序,然后再按MAC排序?

我可以“排序依据”一个UUID类型的列并且期望它总是工作(似乎是工作的)吗?

我想要在多台机器上生成UUID (使用postgresql uuid_generate_v1()),将它们复制到一个Postgres实例中,然后按UUID列排序。它必须保证机器的顺序,而不是所有机器的UUID的顺序。

EN

回答 2

Stack Overflow用户

发布于 2017-04-06 03:24:11

UUID不是为排序而设计的。

如果您希望根据创建顺序选择记录,则应使用时间戳date_creation、auto-increment列(不适用于您的特定情况),或者使用保证排序的算法创建自己的If;例如,合并时间戳+ UUID或时间戳+自动递增。

您可以在数据库中为后面的选项创建一个function。

票数 1
EN

Stack Overflow用户

发布于 2018-11-03 00:59:49

虽然不是一个明确的答案,也就是。“是否在所有PostgreSQL安装中都定义了行为?”这个SQL (用于SQL Server)检查GUID中每个字节的顺序。可能需要对PostgreSQL进行一些调整。

生成这样的映射应该允许查看特定的UUID结构(一个定义良好的类型或其他类型)在PostgreSQL中是否“以特定的方式排序”。

代码语言:javascript
复制
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

在SQL Server (2014,and matches that in SQL Server 2005)中,降序为:

代码语言:javascript
复制
Position by highest-to-lowest value:

A B C D E F | 8 9 | 7 6 | 5 4 | 3 2 1 0

因为SQL Server的newsequentialid利用这种排序来生成索引友好的GUID,所以这种行为可能永远不会改变。SQL Server还必须跨所有系统维护此行为,以支持复制。因此,如果问题是关于SQL Server的,我肯定会说“在SQL Server中GUID的顺序是一致的”,这在SQL Server中是绝对可靠的。

然而,这种排序与.NET的GUID排序不同,如果PostgreSQL中的排序不同,我也不会感到惊讶。SQL Server中的“翻转”差异是因为它遵循COM (https://msdn.microsoft.com/en-us/library/windows/desktop/aa373931(v=vs.85%29.aspx)'s“变体2”(也称为小端))顺序;即使对于“变体1”UUID也是如此。(然而,这似乎更武断,因为为什么组本身是从右到左排序的:更多Microsoft历史?)

有趣的问题仍然存在:在PostgreSQL中指定在哪里/如何排序?如果没有很好地指定,实现还能被视为行为公理吗?

还有see this question for more details about SQL Server's UUIDs;以及关于“为什么”这些差异存在的有趣细节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43238882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档