虽然Postgres开箱即用支持在其本机128-bit表单中存储UUID (Universally Unique Identifier)值,但生成UUID值需要插件.在Postgres中,插件称为扩展.
要安装扩展,请致电CREATE EXTENSION
.要避免重新安装,请添加IF NOT EXISTS.有关详细信息,请参阅my blog post,或参见this page in StackOverflow.
我们想要的扩展是一个用C语言构建的开源库,用于处理UUID,@L_502_8@.build of this library for Postgres经常捆绑Postgres的安装,例如Enterprise DB到Enterprise DB,或者包括在云提供商(如Amazon RDS for PostgreSQL)中.
- CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
生成各种UUID
请参阅extension’s doc以查看为生成各种UUID值而提供的多个命令的列表.要获取从计算机的MAC address加上当前日期时间加上一个小随机值构建的UUID的原始版本,请致电uuid_generate_v1()
.
- SELECT uuid_generate_v1();
672124b6-9894-11e5-be38-001d42e813fe
后来对这个主题的变化是为其他类型的UUID开发的.有些人可能不想记录服务器的实际MAC地址,例如,出于安全或隐私问题. Postgres扩展生成五种UUID,加上“nil”UUID 00000000-0000-0000-0000-000000000000.
UUID作为默认值
可以自动进行该方法调用,以便为任何新插入的行生成默认值.定义列时,请指定:
DEFAULT uuid_generate_v1()
请参阅以下示例表定义中使用的命令.
- CREATE TABLE public.pet_
- (
- species_ text NOT NULL,name_ text NOT NULL,date_of_birth_ text NOT NULL,uuid_ uuid NOT NULL DEFAULT uuid_generate_v1(),-- <====
- CONSTRAINT pet_pkey_ PRIMARY KEY (uuid_)
- )
- WITH (
- OIDS=FALSE
- );
- ALTER TABLE public.pet_
- OWNER TO postgres;
UUID版本
uuid-ossp插件可以生成various versions of UUID.
> uuid_generate_v1()包含当前计算机当前时刻的MAC address.常用,但如果您对披露数据库服务器的MAC或生成此值的时间敏感,请避免使用.由规范定义为Version 1 UUID.
> uuid_generate_v1mc()与Version 1类似,但使用随机多播MAC地址而不是实际MAC地址.显然是一种使用版本1的方法,但如果您对披露这一事实很敏感,则替换另一个MAC而不是数据库服务器的实际MAC.什么是“随机多播MAC”? I do not know exactly.在阅读RFC 4122的第4.1.6节之后,我怀疑这是一个代替MAC的随机数,但是比特设置为指示多播MAC地址而不是通常的单播,以便将版本1的这种变化与通常的实际MAC版本1 UUID.
> uuid_generate_v3(名称空间uuid,名称文本)包含您提供的MD5 hash文本.由规范定义为基于Version 3 UUID,namespace的UUID.
> uuid_generate_v4()基于随机生成的128位121-122的数据.六或七个bits用于表示版本和版本.变种.仅当使用cryptographically-strong random generator实现时,此类UUID才是实用的.由规范定义为Version 4 UUID.
> uuid_generate_v5(名称空间uuid,名称文本)与版本3相同,但使用SHA1散列.由规范定义为Version 5 UUID.
> uuid_nil()一种特殊情况,所有位都设置为零00000000-0000-0000-0000-000000000000.用作未知UUID值的标志.被称为nil UUID.
要比较类型,请参阅问题,Which UUID version to use?
如果您对第3版和第3版感到好奇5,见本课题,Generating v5 UUID. What is name and namespace?.
有关更多讨论,请参阅my Answer至类似问题和我的博客文章UUID values from JDBC to Postgres.