在Postgres for Insert语句中生成一个UUID?

我的问题很简单。 我知道UUID的概念,并且我想生成一个来引用我的数据库中的“商店”中的每个“商品”。 似乎合理的权利?

问题是以下行返回一个错误:

honeydb=# insert into items values(
uuid_generate_v4(), 54.321, 31, 'desc 1', 31.94);
ERROR:  function uuid_generate_v4() does not exist
LINE 2: uuid_generate_v4(), 54.321, 31, 'desc 1', 31.94);
        ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

我已阅读该网页:http://www.postgresql.org/docs/current/static/uuid-ossp.html

在这里输入图像描述

我在Ubuntu 10.04 x64上运行Postgres 8.4。


uuid-ossp是一个contrib模块,所以默认情况下它不会被加载到服务器中。 您必须将其加载到数据库中才能使用它。

对于现代PostgreSQL版本(9.1和更新版本)来说很简单:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

但对于9.0及更低版本,您必须运行SQL脚本来加载扩展。 请参阅8.4中的contrib模块文档。

对于Pg 9.1和更新版本,请阅读当前的contrib文档和CREATE EXTENSION 。 这些功能在9.0或更低版本中不存在,例如8.4。

如果您使用的是PostgreSQL的打包版本,则可能需要安装包含contrib模块和扩展的单独包。 在你的包管理器数据库中搜索'postgres'和'contrib'。


没有扩展名(作弊)

SELECT uuid_in(md5(random()::text || now()::text)::cstring);

output>> c2d29867-3d0b-d497-9191-18a9d8ee7830

(至少在8.4中工作)


@Erwin Brandstetter的好处

SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);

另外,在现代Postgres中,你可以简单地施放:

SELECT md5(random()::text || clock_timestamp()::text)::uuid - 不需要更多的魔法


克雷格林格的答案是正确的。 这里有一些关于Postgres 9.1及更高版本的更多信息......

是否可以扩展?

如果已经为Postgres安装(Postgres术语中的集群)构建了扩展,则只能安装扩展。 例如,我发现uuid-ossp扩展名是EnterpriseDB.com慷慨提供的Mac OS X安装程序的一部分。 几十个扩展中的任何一个都可以使用。

要查看uuid-ossp扩展是否可用于您的Postgres集群,请运行此SQL查询pg_available_extensions系统目录:

SELECT * FROM pg_available_extensions;

安装扩展

要安装与UUID相关的扩展,请使用此SQL中所看到的CREATE EXTENSION命令:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

请注意:尽管有相反的文档,我仍然需要在扩展名附近引用“引号”字符。

SQL标准委员会或Postgres团队为该命令选择了一个奇怪的名称。 在我看来,他们应该选择“安装扩展”或“使用扩展”。

验证安装

通过运行此SQL查询pg_extension系统目录,可以验证扩展是否已成功安装到所需的数据库中:

SELECT * FROM pg_extension;

UUID作为默认值

有关更多信息,请参阅问题:Postgres中UUID列的默认值

旧的方式

以上信息使用了添加到Postgres 9.1中的新扩展功能。 在以前的版本中,我们必须在.sql文件中查找并运行脚本。 扩展功能被添加以使安装更简单,为扩展的创建者交易更多的工作,以减少扩展的用户/消费者方面的工作。 查看我的博客帖子以获得更多讨论。

UUID的类型

顺便说一句,问题中的代码调用函数uuid_generate_v4() 。 这会产生一种称为版本4的类型,其中几乎所有的128位都是随机生成的。 虽然这对于较小的一组行中的有限使用来说很好,但如果您想要几乎消除任何碰撞的可能性,请使用UUID的另一个“版本”。

例如,原始版本1将主机的MAC地址与当前日期时间和任意数字相结合,碰撞的几率几乎为零。

有关更多讨论,请参阅我对有关问题的回答。

链接地址: http://www.djcxy.com/p/91429.html

上一篇: Generating a UUID in Postgres for Insert statement?

下一篇: JavaScript: how to generate UUID for Internet Explorer 9?