我的问题是相当简单的。 我知道一个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。
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”。
如果没有扩展(作弊)
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
在由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地址的主机与当前日期时间和任意数量的,冲突的机会几乎为零。
有关详细讨论,请参阅我的回答对相关问题。
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()函数。
ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);
阅读@ ZuzEL的回答后,我用上面的代码作为列ID的默认值,它的正常工作。