当前位置: 首页 > 知识库问答 >
问题:

在Postgres for Insert语句中生成UUID?

邵弘致
2023-03-14

我的问题很简单。我知道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。

共有3个答案

勾起运
2023-03-14

Craig Ringer的答案是正确的。以下是Postgres 9.1及更高版本的更多信息...

只有在为Postgres安装(Postgres术语中的集群)构建了扩展后,才能安装它。例如,我发现uuid ossp扩展包含在EnterpriseDB提供的Mac OS X安装程序中。通用域名格式。几十个分机中的任何一个都可以使用。

要查看您的Postgres集群中是否有uuid ossp扩展,请运行以下SQL查询pg_available_extensions系统目录:

SELECT * FROM pg_available_extensions;

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

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

注意:我发现扩展名周围的引号字符是必需的,尽管文档与此相反。

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

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

SELECT * FROM pg_extension;

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

以上信息使用了Postgres 9.1新增的扩展功能。在以前的版本中,我们必须在。sql文件。扩展功能的添加是为了使安装更容易,用扩展的创建者的更多工作换取扩展的用户/消费者的更少工作。更多讨论请参见我的博客帖子。

顺便说一下,问题中的代码调用函数uuid_generate_v4()。这会生成一种称为Version 4的类型,其中几乎所有的128位都是随机生成的。虽然这对于在较小的行集上的有限使用是很好的,如果您想虚拟地消除任何冲突的可能性,请使用UUID的另一个"版本"。

例如,原始版本1将主机的MAC地址与当前日期时间和任意数字结合在一起,发生冲突的可能性几乎为零。

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

饶高雅
2023-03-14
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);

此外,在现代博士后中,你可以简单地选择:

选择md5(random()::text | | clock_timestamp()::text)::uuid

莫欣悦
2023-03-14

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

对于现代PostgreSQL版本(9.1及更新版本),这很简单:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

但是对于9.0及以下版本,您必须运行SQL脚本来加载扩展。有关contrib模块,请参见8.4中的文档。

对于第9.1页及更新版本,请阅读当前的contrib文档和创建扩展名。这些功能在9.0或更早的版本中不存在,比如8.4。

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

 类似资料:
  • 请考虑以下代码 它将在屏幕上打印24。 现在假设我在枚举中有更多的值,并且我定义了类特征的所有相应模板特化。 备注: 我必须使用它的情况要复杂得多,自动操作会非常有帮助。 使用switch语句对我来说很重要,因为可以实现速度(速度对我的应用程序至关重要)。 谢谢! null > 在我的实际应用程序中,枚举包含几乎50个不同的值,它将在将来被扩展(希望由其他人扩展)。枚举包含连续值。 类“trait

  • 我正在使用jOOQ生成SQL语句。如何创建insert语句?我可以生成select语句,但无法生成insert语句。我可以创建如下select语句: 如何为insert创建SQL语句

  • 我试图执行一个生成inserts语句的查询,如下所示: 但是我有这个错误: 为什么?我试着用< code>||代替< code> ,用< code>to_char,但是它没有改变。

  • 为了从我的数据库(oracle,db2)生成insert语句,我使用了带参数的liquibase generateChangeLog命令

  • 问题内容: 将NHibernate配置为显示执行的SQL可以完成预期的工作,但是每当需要将SQL字符串复制粘贴到SQL Server Management Studio中时,为了使其兼容,我们都必须对其进行重新排列。 在开始开发自己的应用程序以将其解析并重新排列为对ManagementStudio更友好的SQL之前,我想重申一下以前从未做过的事情- 我不愿意花时间在此上,以后再查找。 是否有一种廉

  • 我最近一直在突破到Python,因为C很有趣,但是python看起来有点酷。我想让Python做一些事情,只要输入在一定的数字范围之间。 当我做elif语句时,问题就出现了,我做不到,所以Python只打印“做得很好”语句,只要等级在65到89之间。你会如何处理数字的范围?