如何在PostgreSQL中创建guid

如何在PostgreSQL中创建guid,postgresql,plpgsql,guid,Postgresql,Plpgsql,Guid,如何在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_ser

如何在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;

尝试

但它返回相同的值

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

如何修复此问题以返回唯一的行?

PostgreSQL具有标准发行版附带的
uuid ossp
扩展,它有5种生成
uuid
s的标准算法。请注意,
guid
uuid
的Microsoft版本,在概念上它们是相同的

CREATE EXTENSION "uuid-ossp";
然后:

还请注意,一旦安装了扩展,PostgreSQL就有一个实际的二进制
uuid
类型,长度为16字节。使用二进制类型比使用文本等效类型快得多,而且占用的空间更少。如果您确实需要字符串版本,只需将其强制转换为
text

SELECT uuid_generate_v4()::text;

有什么理由不使用已经提供的函数吗?UUID生成器使用在事务期间不会更改的值来生成UUID,因此它生成相同的UUID。这是一个糟糕的实现;使用带有“no”名称的“horse”链接到的正式函数。可能是Windows问题,缺乏精确性:我尝试了
创建扩展名,如果不存在“uuid ossp”模式public
,但出现错误
无法打开扩展名控制文件/usr/pgsql-9.3/share/EXTENSION/uuid ossp.control]:没有这样的文件或目录
。如何修复?在由gcc(gcc)4.4.7 20120313(Red Hat 4.4.7-3)编译的x86_64-unknown-linux-gnu上的PostgreSQL 9.3.2标准发行版中使用64位“,这很奇怪,因为模块应该包含在标准发行版的标准位置。您可以尝试
创建扩展名pgcrypto
,该扩展名创建函数
gen\u random\u uuid()
,该函数返回v4
uuid
。我尝试过,但出现错误
无法打开扩展名控制文件/usr/pgsql-9.3/share/EXTENSION/pgcrypto.control“:没有这样的文件或目录
可能服务器中需要安装一些东西?您的安装显然不标准。尝试使用
find
命令定位文件系统上的
*.control
文件,然后将找到这些文件的整个目录内容移动到
/usr/pgsql-9.3/share/extension
@Andrus我必须运行
yum install postgresql93 contrib
才能在CentOS 6.7上安装uuid ossp扩展机器。根据我在Postgres文档中的发现,pgcrypto可以从9.4或更高版本生成UUID。
SELECT uuid_generate_v4();
SELECT uuid_generate_v4()::text;