如何在Ubuntu 10.04上使用PostgreSQL 8.4.4生成UUID?

5
我正在运行Ubuntu 10.04上的PostgreSQL 8.4.4。
我正在尝试生成uuid,但找不到方法。
我确实有/usr/share/postgresql/8.4/contrib/uuid-ossp.sql中的uuid-ossp.sql。
当我尝试时,我得到了以下结果:
postgres=# SELECT uuid_generate_v1();
ERROR:  function uuid_generate_v1() does not exist
LINE 1: SELECT uuid_generate_v1();
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

有什么想法吗?
2个回答

12

contrib中的内容不会自动运行。您需要自己运行它来安装函数。我不清楚8.4版本,但在8.3版本中,它似乎只是在每个数据库中安装它,因此在psql中打开您正在使用的数据库并发出命令 \i /usr/share/postgresql/8.4/contrib/uuid-ossp.sql


是的,它是按数据库计算的。您可以在template1数据库中安装所有内容,以确保每个使用此数据库作为其模板(这是默认设置)的新数据库都包括所有contrib模块。 - Frank Heikens
对于当前版本的Postgresql(9.0+,我想),contrib模块被打包为扩展。扩展很棒,因为它们可以进行版本控制、命名空间和卸载。例如,您可以使用以下命令在“uuid”模式中安装uuid函数:“create extension uuid-ossp schema uuid”。然后,您可以像这样访问函数:“uuid.uuid_generate_v4()”。 - Wren T.
1
执行 apt-get install postgresql-contrib 然后 psql -f /usr/share/postgresql/8.4/contrib/uuid-ossp.sql nameofdatabase - 仅供懒人使用 ;) - Torben

1

我在 PostgreSQL 的使用中看到了这个。需要 pgcrypto contrib 模块。

CREATE OR REPLACE FUNCTION generate_uuid() RETURNS UUID AS
$$
SELECT ENCODE(GEN_RANDOM_BYTES(16), 'hex')::UUID
$$ LANGUAGE SQL IMMUTABLE;

1
对于我们班级后排的同学,要将东西安装到/contrib中,需要执行sudo apt-get install postgresql-contrib命令。@paul 谢谢。 - J Evans
5
不要将函数声明为“IMMUTABLE”,因为您不想使用缓存读取而不是函数评估。将函数声明为“VOLATILE”,以确保每次调用函数时都会执行它。请参阅http://www.postgresql.org/docs/8.3/interactive/xfunc-volatility.html了解更多解释。 - Augustus Kling
当我执行这个函数时,会出现以下错误: ERROR: 违反唯一约束条件 "relation_pkey" 的重复键值 DETAIL: 键 (id)=(5a0cd072-6463-2cb0-9de9-42aabb85f270) 已经存在。 但是,根据上面提到的方法将其更改为VOLATILE可以解决问题。 - Christopher Käck
这不会生成有效的UUID,请参考RFC 4122。某些位标记UUID版本,它们将是随机的,并且大多数情况下无效。 - postfuturist

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