如何在PostgreSQL中创建GUID

33

如何在Postgres 9.0+中创建Windows格式的GUID?

我尝试了以下函数:

CREATE or REPLACE FUNCTION public.getguid() RETURNS varchar AS $BODY$ 
DECLARE 
  v_seed_value varchar(32); 
BEGIN 
  select 
    md5( 
      inet_client_addr()::varchar || 
      timeofday() || 
      inet_server_addr()::varchar || 
      to_hex(inet_client_port()) 
    ) 
  into v_seed_value; 

  return (substr(v_seed_value,1,8) || '-' || 
          substr(v_seed_value,9,4) || '-' || 
          substr(v_seed_value,13,4) || '-' || 
          substr(v_seed_value,17,4) || '-' || 
          substr(v_seed_value,21,12)); 
END; $BODY$ LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER;

来自

http://postgresql.1045698.n5.nabble.com/newid-in-postgres-td1879346.html

尝试过

select getguid()
union all
select getguid()

但它返回相同的值

"c41121ed-b6fb-c9a6-bc9b-574c82929e7e"
"c41121ed-b6fb-c9a6-bc9b-574c82929e7e"

如何修复这个问题,以便返回唯一的行?


3
您不使用已提供的函数,有什么原因吗?http://www.postgresql.org/docs/current/static/uuid-ossp.html - user330315
那个UUID生成器使用在事务期间不会改变的值来生成UUID,因此它会生成相同的UUID。这是一个糟糕的实现;请使用a_horse_with_no_name链接到的官方函数。 - Colonel Thirty Two
1
可能是Windows的问题,缺乏精确性:http://www.postgresql.org/message-id/9699.1262011789@sss.pgh.pa.us - Frank Heikens
2个回答

81

PostgreSQL有uuid-ossp扩展,它随着标准发行版一起提供,并且有5种标准算法用于生成uuid。请注意,guid是微软版本的uuid,从概念上讲,它们是相同的。

CREATE EXTENSION "uuid-ossp";

那么:

SELECT uuid_generate_v4();

需要注意的是,一旦您安装了这个扩展程序,PostgreSQL 就会有一个实际的二进制 uuid 类型,长度为 16 字节。使用二进制类型比使用文本等效类型更快,占用更少的空间。如果您确实需要字符串版本,可以将其简单地转换为 text

SELECT uuid_generate_v4()::text;

PostgreSQL 13+

现在您可以使用内置函数gen_random_uuid()获取版本4的随机UUID。


我尝试了 CREATE EXTENSION IF NOT EXISTS "uuid-ossp" SCHEMA public 但是出现了错误 could not open extension control file "/usr/pgsql-9.3/share/extension/uuid-ossp.control": No such file or directory。如何解决?使用标准发行版 "PostgreSQL 9.3.2 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3), 64-bit" - Andrus
2
这很奇怪,因为该模块应该包含在其标准位置的标准分发中。您可以尝试使用CREATE EXTENSION pgcrypto命令创建函数gen_random_uuid(),该函数返回v4 uuid - Patrick
在Windows服务器上,“ERROR: could not load library "C:/Program Files/PostgreSQL/9.3/lib/uuid-ossp.dll"”错误出现了。这是因为应用程序的并行配置不正确导致启动失败。请查看应用程序事件日志或使用命令行sxstrace.exe工具获取更多详细信息。此错误发生在以下命令中:`(请注意,这里没有提供具体命令) - Andrus
1
@Andrus 我不得不在CentOS 6.7机器上运行yum install postgresql93-contrib来安装uuid-ossp扩展。根据我在Postgres文档中找到的信息,pgcrypto可以从9.4或更高版本生成UUID。 - Rafe
1
文档显示这两个函数都生成V4 uuid,因此它们在执行的任务上应该是相同的(恕我打个双关语)。区别是gen_random_uuid()不需要安装扩展。 - Patrick
显示剩余4条评论

0
CREATE or REPLACE FUNCTION public.getguid() RETURNS uuid AS $BODY$ 
DECLARE
  v_seed_value uuid; 
begin
 select cast(g.guid as uuid)
 into v_seed_value
 from (
SELECT uuid_in(overlay(overlay(md5(random()::text || ':' || random()::text) placing '4' from 13) placing to_hex(floor(random()*(11-8+1) + 8)::int)::text from 17)::cstring)  guid
) g;
  return v_seed_value;
END; $BODY$ LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER;

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