如何在PostgreSQL中创建guid
如何在Postgres 9.0+中创建Windows格式的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
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()
,该函数返回v4uuid
。我尝试过,但出现错误无法打开扩展名控制文件/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;