Postgres UUID类型错误

13

我正在尝试在PostgreSQL的表中创建UUID id。我已经尝试了以下方法:

id uuid PRIMARY KEY DEFAULT uuid_generate_v4()

但是我收到了以下错误信息:

错误:函数uuid_generate_v4()不存在 提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。

我尝试加入模式,例如:id uuid PRIMARY KEY DEFAULT public.uuid_generate_v4()(如此处评论中所述)

我还检查了扩展是否存在(SELECT * FROM pg_available_extensions;),是的,我在PostgreSQL数据库中安装了它:

enter image description here

我了解到如果Postgres运行在--single模式下,则此方法可能无法正常工作,但我不知道如何测试它或是否有任何方法可以测试它。

有人知道我该如何解决这个问题吗?或者还有其他选择吗? 像这样使用是一个好主意吗:

SET DEFAULT uuid_in(md5(random()::text || now()::text)::cstring);

2
注意:如果你只需要随机生成(版本4)的UUID,可以考虑使用pgcrypto模块中的gen_random_uuid()函数。 - Philip Tzou
1
我认为您没有加载 uuid-ossp - Haleemur Ali
1
你可能把 uuid-ossp 安装到了不在搜索路径上的单独模式中了吗? - user330315
4个回答

31

由于找不到函数uuid_generate_v4,这表明扩展程序uuid-ossp没有被加载。

pg_available_extensions列出了可用的扩展程序,但不一定已加载。

要查看已加载扩展程序的列表,请查询视图pg_extension

select * from pg_extension;

要加载uuid-ossp扩展,请运行以下命令:

CREATE EXTENSION "uuid-ossp";

注意: 这需要超级用户权限。

在成功加载uuid-ossp扩展之后,您应该在pg_extension视图中看到它,并且函数uuid_generate_v4应该可用。


如果我使用:select * from pg_extensions; 我会得到错误: ERROR: relation "pg_extensions" does not exist. 目前我正在使用:uuid_in(md5(random()::text || now()::text)::cstring) - JP. Aulet
对不起,那是我的笔误。实际上视图被称为pg_extension,正在更新帖子。 - Haleemur Ali
1
在执行此操作之前,请确保您位于正确的数据库中。扩展似乎是在每个数据库级别上加载的。 - bastula

2
在我的情况下,我需要在函数调用中添加模式,如下所示:app.uuid_generate_v4(),而不是uuid_generate_v4()
我通过运行此查询找到每个扩展的模式:
SELECT 
pge.extname,
pge.extversion,
pn.nspname AS schema
FROM pg_extension pge 
JOIN pg_catalog.pg_namespace pn ON pge.extnamespace = pn."oid" ;

0

有时你只需要运行这行代码:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

在创建表之前


0
我曾经遇到过同样的问题。我只是删除了扩展并运行了一下:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

问题解决了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接