如何在 PostgreSQL 中创建 guid

问题描述 投票:0回答:2

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

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

postgresql plpgsql guid
2个回答
80
投票

PostgreSQL 有标准发行版附带的

uuid-ossp
扩展,它有 5 种用于生成
uuid
的标准算法。请注意,
guid
是 Microsoft 版本的
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。


0
投票

选择 uuid_in(overlay(overlay(md5(random()::text || ':' || random()::text) 从 13 中放置 '4') 放置 to_hex(floor(random()*(11-8) +1) + 8)::int)::来自 17)::cstring) 的文本

工会

选择 uuid_in(overlay(overlay(md5(random()::text || ':' || random()::text) 从 13 中放置 '4') 放置 to_hex(floor(random()*(11-8) +1) + 8)::int)::来自 17)::cstring) 的文本

© www.soinside.com 2019 - 2024. All rights reserved.