需要一个用于Postgres的UUID生成器?这里有两种设置方法

目录

什么是UUID?

为什么Postgres不自己生成UUID?

如何在Postgres中生成UUIDS

方法一:使用uuid-ossp模块

方法 2:使用gen_random_uuid()模块

gen_random_uuid()和uuid_generate_v4()的区别

我应该使用UUID作为我的主键吗?

结论


需要一个用于Postgres的UUID生成器?这里有两种设置方法_第1张图片

Postgres比其他一些数据库执行得更好,因为它支持并发写操作而不需要读/写锁。因为它完全符合ACID并提供事务隔离和快照,所以现在许多应用程序都在使用Postgres。不幸的是,虽然PostgreSQL非常适合存储和比较UUID数据,但它缺乏在其核心中创建UUID值的功能。相反,它依赖第三方模块使用指定的技术创建UUID。在本文中,您将通过使用各种函数和模块的示例了解PostgreSQL UUID数据类型以及如何生成UUID值。

什么是UUID

UUID既是Universal Unique Identifier,由RFC 4122和其他相关标准定义。UUID是一系列由连字符分隔的小写十六进制数字。UUID36个字符的数字、字母和破折号序列的组合,旨在全球唯一。

由于这个奇妙的特性,UUID经常在分布式系统中使用,因为它比SERIAL数据类型确保了更多的唯一性,SERIAL数据类型只在单个数据库中创建唯一条目。不同的计算机可以同时产生UUID而无需通信,并且保证UUID是唯一的。使用UUID的独立系统可以随时安全地组合,而不必担心发生冲突。Postgres中的uuid列数据类型支持全局唯一标识符(UUID)。如果您的表有一个UUID列,您可能需要生成一个UUID。因为没有一种技术可以完美地适用于每个应用程序,所以PostgreSQL具有UUID的存储和比较功能,但没有在核心数据库中生成UUID的功能。

为什么Postgres不自己生成UUID

PostgreSQL允许您存储和比较UUID值,但它没有任何内置方法来创建它们。这就是开发这篇文章的原因——向您展示在Postgres中生成UUIDS的几种方法。

如何在Postgres中生成UUIDS

方法一:使用uuid-ossp模块

如上所述,PostgreSQL允许您存储和比较UUID值,但它没有任何内置方法来创建它们。相反,它依赖于使用指定技术创建UUID的第三方模块。例如uuid-ossp,该模块具有实现常见UUID生成技术的各种有用方法。要安装uuid-ossp模块,请使用如下CREATE EXTENSION语句:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

IF NOT EXISTS子句允许您避免重新安装模块。要根据计算机的MAC地址、当前时间戳和随机值的组合生成UUID值,请使用以下uuid_generate_v1()函数:SELECT uuid_generate_v1();

在此示例中,该函数生成以下UUID值:

uuid_generate_v1
--------------------------------------
0e37df36-f698-11e6-8dd4-cb9ced3df976
(1 row)

如果要仅根据随机数生成UUID值,可以使用该uuid_generate_v4()函数。例如:

SELECT uuid_generate_v4();

uuid_generate_v4
-------------------------------------- 
a81bc81b-dead-4e5d-abff-90865d1e13b1
(1 row)

有关UUID生成函数的更多信息,请查看uuid-ossp模块文档。

方法 2:使用gen_random_uuid()模块

PostgreSQL发行版中包含其他提供的模块,但默认情况下不安装它们。任何具有该CREATE权限的用户帐户都可以安装模块。在pgcrypto模块中,有一个称为uuid生成方法,该方法gen_random_uuid()使用完全由随机十六进制整数组成的版本4算法创建 uuid

以下SQL命令用于查找所有可用的扩展。它们还将显示当前安装的列表。

SELECT * FROM pg_avilable_extensions ORDER BY name; 
-- list available extensions

SELECT * FROM pg_extension; 
-- list installed extensions

要安装pgcrypto扩展,请使用以下命令:

CREATE EXTENSION IF NOT EXISTS "pgcrypto"; -- creates extension

一旦安装了pgcrypto扩展,下面会返回一个随机的UUID

SELECT gen_random_uuid(); -- generate a random uuid of version 4
842d3fae-7788-4ecb-b441-7c7e8130b8bf

gen_random_uuid()uuid_generate_v4()的区别

gen_random_uuid()uuid_generate_v4()两者都生成UUID。它们之间的主要区别在于gen_random_uuid()pgcrypto 模块提供,而uuid_generate_v4()uuid-ossp 扩展提供。这些模块中的每一个都有一些限制,应该在您的应用程序的上下文中考虑这些限制。

uuid-ossp上的Postgres文档建议使用gen_random_uuid()。如果您只需要随机生成的(版本 4UUID。此外,该uuid-ossp扩展还提供了其他类型的UUID(例如基于MAC地址的)。

要考虑的另一个因素是这些工具用于生成随机值的不同方法:uuid_generate_v4()使用arc4random确定随机部分,而 gen_random_uuid()使用fortuna替代。

我应该使用UUID作为我的主键吗?

这取决于很多事情。

  • 由于UUID是唯一的,因此您可以将其用作数据库中的主键。但请记住,UUID占用的空间比SEQUENCE多一点。它们的生成速度也很慢。但是,它们无疑是独一无二的,可确保您收到准确的数据。
  • UUID编号在表、数据库甚至服务器中是唯一的,允许您组合来自多个数据库的条目或将数据库分布在多个服务器上。因为UUID值不会透露有关您的数据的信息,所以在URL中使用它们会更安全。这种好处可以使使用UUID的成本变得物有所值。

结论

PostgreSQL中,ID字段有多种替代方法,每种方法都有一个合适的用例来决定是否使用它。我们在这篇文章中研究了利用gen_random_uuid()uuid-generate_v4()。选择最适合您的应用程序的选项,并记得玩得开心!

https://www.codeproject.com/Articles/5318885/Need-a-UUID-Generator-for-Postgres-Here-are-Two-Wa

你可能感兴趣的:(数据库,UUID,Postgres)