Postgresql 在Postgres中为Insert语句生成UUID?
我的问题很简单。我知道UUID的概念,我想生成一个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
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