如何在PostgreSQL中创建guid

gopyfrb3  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(252)

如何在Postgres 9.0+中创建Windows格式的日志?
我试过函数

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"


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

oyxsuwqo

oyxsuwqo1#

PostgreSQL有uuid-ossp扩展,它与标准发行版一起提供,它有5个标准算法用于生成uuid s。请注意,guiduuid的Microsoft版本,概念上它们是一样的。

CREATE EXTENSION "uuid-ossp";

字符串
然后:

SELECT uuid_generate_v4();


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

SELECT uuid_generate_v4()::text;

PostgreSQL 13+

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

7tofc5zh

7tofc5zh2#

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;

字符串

相关问题