在Postgres插入语句生成一个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模块文档 。

对于9.1及更高版本,请阅读当前的contrib文档和CREATE EXTENSION 。 这些function在9.0或更低版本中不存在,比如8.4。

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

没有扩展(作弊)

 SELECT uuid_in(md5(random()::text || now()::text)::cstring); output>> c2d29867-3d0b-d497-9191-18a9d8ee7830 

(至less在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术语中的集群 )构build了扩展,则只能安装扩展。 例如,我发现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"; 

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

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

validation安装

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

 SELECT * FROM pg_extension; 

UUID作为默认值

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

旧的方式

以上信息使用添加到Postgres 9.1中的新扩展function。 在以前的版本中,我们必须在.sql文件中查找并运行脚本。 扩展function被添加,使安装更容易,为扩展的创build者交易更多的工作,以减less扩展的用户/消费者的工作。 请参阅我的博客post以获取更多讨论

pgcrypto扩展

从Postgres 9.4开始, pgcrypto模块包含了gen_random_uuid()函数。 该函数生成基于随机数的UUID版本4types之一 。

获取贡献模块,如果尚不可用。

 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 ) ; 

引用来自uuid-ossp模块的Postgres文档 。

注意:如果您只需要随机生成(版本4)UUID,请考虑使用pgcrypto模块中的gen_random_uuid()函数。

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

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