Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在Postgres中为Insert语句生成UUID?_Postgresql_Uuid_Postgresql 8.4 - Fatal编程技术网

Postgresql 在Postgres中为Insert语句生成UUID?

Postgresql 在Postgres中为Insert语句生成UUID?,postgresql,uuid,postgresql-8.4,Postgresql,Uuid,Postgresql 8.4,我的问题很简单。我知道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, 'des

我的问题很简单。我知道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.
我已在以下位置阅读了该页面:


我正在Ubuntu 10.04 x64上运行Postgres 8.4。

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

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

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
但是对于9.0及以下版本,您必须运行SQL脚本来加载扩展。看

对于第9.1页及更新版本,请阅读和。这些功能在9.0或旧版本(如8.4)中不存在

如果您使用的是打包版本的PostgreSQL,则可能需要安装包含contrib模块和扩展的单独软件包。在package manager数据库中搜索“postgres”和“contrib”。

正确无误。这里有更多关于Postgres 9.1及更高版本的信息

有分机吗? 只有在为您的Postgres安装(您的集群使用Postgres行话)构建了扩展时,才能安装它。例如,我发现EnterpriseDB.com在Mac OS X安装程序中包含了扩展。任何一种都可以使用

sudo apt-get install postgresql-contrib-9.4
要查看您的Postgres集群中是否有uuid ossp扩展,请运行以下SQL查询系统目录:

从pg\u可用扩展中选择*;
安装扩展插件 要安装该相关扩展,请使用此SQL中的命令:

创建不存在的扩展“uuid ossp”;
注意:我发现扩展名周围的引号字符是必需的,尽管文档与此相反

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

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

从pg_扩展中选择*;
UUID作为默认值 有关更多信息,请参见问题:

老路 以上信息使用Postgres 9.1的新扩展功能。在以前的版本中,我们必须在.sql文件中查找并运行脚本。添加扩展功能是为了使安装更容易,用更多的工作换取扩展用户/消费者更少的工作。有关更多讨论,请参阅我的

uuid的类型 顺便说一下,问题中的代码调用函数
uuid\u generate\u v4()
。这将生成一种称为的类型,其中几乎所有128位都是随机生成的。虽然这对于在较小的行集合上进行有限的使用是很好的,但如果您想实际上消除任何冲突的可能性,请使用另一个UUID“版本”

例如,原始版本将主机的时间与当前日期时间和任意数字相结合,碰撞的机会几乎为零

有关更多讨论,请参阅关于相关问题的。

不带扩展名(作弊) (至少在第8.4节中有效)

  • 感谢@Erwin Brandstetter的
    时钟时间戳()
    解释

如果您需要有效的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


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

选择md5(随机()::text | | clock_timestamp()::text::uuid

pgcrypto
扩展名 从Postgres 9.4开始,
pgcrypto
模块包括该功能。此函数生成一个基于随机数的函数

获取contrib模块(如果尚未可用)

sudo apt-get install postgresql-contrib-9.4
使用
pgcrypto
模块

CREATE EXTENSION "pgcrypto";
gen\u random\u uuid()
功能现在应该可用

示例用法

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

从模块中引用

注意:如果您只需要随机生成的(版本4)UUID,请考虑使用PGCODETO模块中的GeNangRead UUID()函数代替.< /P> 在阅读了@ZuzEL的答案后,我使用上述代码作为列id的默认值,它工作正常。

PostgreSQL 13本机支持:

PostgreSQL包含一个生成UUID的函数:

gen_random_uuid () → uuid
此函数返回版本4(随机)UUID。这是最常用的UUID类型,适用于大多数应用程序

从2021年起更新, 在
insert
语句上自动生成
uuid
不需要花哨的技巧

只要做一件事:

  • defaultgen\u random\u uuid()
    的默认值设置为
    uuid
    列。 仅此而已
  • 比如说,你有一张这样的桌子:

    创建表\u名称(
    唯一\u id UUID默认生成\u随机\u UUID(),
    first_name VARCHAR不为空,
    姓氏VARCHAR不为空,
    电子邮件VARCHAR不为空,
    打电话给瓦查尔,
    主键(联系人id)
    );
    
    现在,无需执行任何操作即可将uuid值自动插入到
    unique\u id
    列中。因为您已经为它定义了默认值。您可以简单地专注于在其他列上插入,而
    postgresql
    会处理您的
    唯一\u id
    。下面是一个insert语句示例:

    插入表格名称(名字、姓氏、电子邮件、电话)
    价值观(
    “贝基”,
    “奥塔耶夫”,
    'beki@bekhruz.com',
    '123-456-123'
    )
    
    请注意,
    unique\u id
    中没有插入,因为它已经被处理好了

    关于其他扩展,如
    uuid ossp
    ,如果您对postgres的标准
    gen_random_uuid()
    函数不满意,可以使用它们。大多数情况下,如果您使用的是di,没有它们,您应该不会有问题
    gen_random_uuid () → uuid