如何在PostgreSQL中创建guid

And*_*rus 7 postgresql guid plpgsql

如何在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;
Run Code Online (Sandbox Code Playgroud)

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

试着

select getguid()
union all
select getguid()
Run Code Online (Sandbox Code Playgroud)

但它返回相同的值

"c41121ed-b6fb-c9a6-bc9b-574c82929e7e"
"c41121ed-b6fb-c9a6-bc9b-574c82929e7e"
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*ick 22

PostgreSQL具有uuid-ossp标准发行版附带的扩展,它有5个标准算法用于生成uuids.请注意,a guid是Microsoft的a版本uuid,从概念上讲它们是相同的.

CREATE EXTENSION "uuid-ossp";
Run Code Online (Sandbox Code Playgroud)

然后:

SELECT uuid_generate_v4();
Run Code Online (Sandbox Code Playgroud)

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

SELECT uuid_generate_v4()::text;
Run Code Online (Sandbox Code Playgroud)

  • 这很奇怪,因为该模块应该包含在标准发行版的标准位置。您可以尝试“CREATE EXTENSION pgcrypto”,它创建返回 v4“uuid”的函数“gen_random_uuid()”。 (2认同)