我的问题很简单。我知道一个UUID的概念,我想生成一个引用每个“项目”从一个“商店”在我的DB与。似乎很合理,对吧?
问题是下面这行返回了一个错误:
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。
Craig Ringer的答案是正确的。下面是关于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相关的扩展,使用CREATE extension命令,如下面的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。
获取贡献模块(如果尚未可用)。
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模块。
注意:如果您只需要随机生成的uuid(版本4),请考虑使用pgcrypto模块中的gen_random_uuid()函数。
uuid-ossp模块提供了生成uuid (universally unique identifier)的函数。
uuid_generate_v1()该函数生成版本1的UUID。
添加扩展
如果“uuid-ossp”不存在,则创建扩展;
验证扩展
SELECT * FROM pg_extension;
运行查询
INSERT INTO table_name(id, columnn1, column2, column3,…)值
(uuid_generate_v1(), value1, value2, value3…);
验证表数据
没有扩展(作弊)
如果您需要一个有效的v4 UUID
SELECT uuid_in(overlay(overlay(md5(random()::text || ':' || random()::text) placing '4' from 13) placing to_hex(floor(random()*(11-8+1) + 8)::int)::text from 17)::cstring);
感谢@Denis Stafichuk @Karsten和@autronix
或者你可以简单地通过这样做来获得类似uuid的值(如果你不关心有效性):
SELECT uuid_in(md5(random()::text || random()::text)::cstring);
output>> c2d29867-3d0b-d497-9191-18a9d8ee7830
(至少在8.4中有效)
Craig Ringer的答案是正确的。下面是关于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相关的扩展,使用CREATE extension命令,如下面的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地址与当前日期-时间和任意数字结合在一起,碰撞的机会几乎为零。
有关更多讨论,请参阅我对相关问题的回答。