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

try

select getguid()
union all
select getguid()

但它返回相同的值

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

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

推荐答案

PostgreSQL有标准发行版附带的uuid-ossp扩展,有5个生成uuids的标准算法.请注意,guiduuid的微软版本,概念上它们是一样的.

CREATE EXTENSION "uuid-ossp";

然后:

SELECT uuid_generate_v4();

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

SELECT uuid_generate_v4()::text;

PostgreSQL 13+

现在,您可以使用内置函数gen_random_uuid()获得版本4随机UUID.

Postgresql相关问答推荐

Redis作为postgreSQL嵌套数据的缓存

Postgs密码重置问题

将具有自定义类型的表从一种模式复制到另一种模式

使用正则表达式计算 SQL 查询中 WHERE 过滤器的数量

如何在postgresql中按时间查询

PostgreSQL - 改变数字的精度?

使用 ON CONFLICT 从 INSERT 返回行,无需更新

在 PostgreSQL docker 镜像中创建表

更详细地解释 JOIN 与 LEFT JOIN 和 WHERE 条件性能建议

postgresql 在查询中插入空值

mysql_insert_id 替代 postgresql

如何在数据库表中查找重复条目?

使用 pg_dump 和 psql -U postgres db_name < ... 移动数据库会导致ERROR: relation "table_name" does not exist

如何使用 WITH RECURSIVE 子句进行 Select

Windows 上的 GeoDjango:Could not find the GDAL library" / "OSError: [WinError 126] The specified module could not be found

在同一台机器上创建多个 Postgres 实例

PostgreSQL 9 在 Windows 上安装:Unable to write inside TEMP environment path.

判断 PostgreSQL 中的角色是否设置了密码

在布尔字段上添加索引

PostgreSQL - GROUP BY 子句或用于聚合函数