生成Insert语句Postgres里一个UUID?(Generating a UUID in Po

2019-06-18 06:08发布

我的问题是相当简单的。 我知道一个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 64位运行的Postgres 8.4。

Answer 1:

uuid-ossp是一个的contrib模块,所以它不会加载到默认服务器。 你必须将其加载到数据库中使用它。

对于现代的PostgreSQL的版本(9.1和更高版本),很容易:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

但对9.0及以下必须改为运行SQL脚本加载扩展。 见为的contrib模块的文档中8.4 。

对于PG 9.1和更高版本,而不是看当前的contrib文档和CREATE EXTENSION 。 这些功能并不在9.0或以上版本的存在,像你的8.4。

如果你正在使用PostgreSQL的包装版本,你可能需要安装包含的contrib模块和扩展一个单独的包。 搜索你的包管理数据库“Postgres的”和“的contrib”。



Answer 2:

如果没有扩展(作弊)

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

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

(在8.4工作至少)

  • 由于@Erwin Brandstetter修改为clock_timestamp()的说明。

如果你需要一个有效的V4 UUID

SELECT uuid_in(overlay(overlay(md5(random()::text || ':' || clock_timestamp()::text) placing '4' from 13) placing to_hex(floor(random()*(11-8+1) + 8)::int)::text from 17)::cstring);

*由于@Denis Stafichuk @Karsten@autronix


此外,在现代的Postgres,你可以简单地投:

SELECT md5(random()::text || clock_timestamp()::text)::uuid



Answer 3:

在由Craig林格答案是正确的。 下面是Postgres的9.1和更高版本多一点信息...

是伸展的?

如果它已经被建为你的Postgres安装(你的Postgres里的行话集群 ),则只能安装一个扩展。 例如,我发现UUID-OSSP包括作为麻烦安装的Mac OS X的一部分延伸设置由EnterpriseDB.com。 任何一个的数十个扩展可用。

要看到,如果UUID-OSSP扩展是在你的Postgres集群,开放,运行该SQL查询pg_available_extensions系统目录:

SELECT * FROM pg_available_extensions;

安装扩展

要安装UUID -相关的扩展,使用创建扩展命令,在这本SQL看出:

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地址的主机与当前日期时间和任意数量的,冲突的机会几乎为零。

有关详细讨论,请参阅我的回答对相关问题。



Answer 4:

pgcrypto扩展

对于Postgres 9.4的,所述pgcrypto模块包括gen_random_uuid()函数。 这个函数生成基于随机数的一个版本4类型UUID的 。

获取的contrib模块,如果不是已经可用。

sudo apt-get install postgresql-contrib-9.4

使用pgcrypto模块。

CREATE EXTENSION "pgcrypto";

gen_random_uuid()函数现在应该可用;

实施例的使用情况。

INSERT INTO items VALUES( gen_random_uuid(), 54.321, 31, 'desc 1', 31.94 ) ;


报价从上Postgres的文档uuid-ossp模块。

注意:如果你只需要随机生成的(第4版)的UUID,请考虑使用从pgcrypto模块代替gen_random_uuid()函数。



Answer 5:

ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);

阅读@ ZuzEL的回答后,我用上面的代码作为列ID的默认值,它的正常工作。



文章来源: Generating a UUID in Postgres for Insert statement?