504

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

4

8 回答 8

576

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

对于现代 PostgreSQL 版本(9.1 和更高版本),这很容易:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

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

对于 Pg 9.1 和更新版本,请阅读当前的 contrib 文档CREATE EXTENSION. 这些功能在 9.0 或更早版本中不存在,例如您的 8.4。

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

于 2012-09-20T02:03:29.550 回答
422

没有扩展名(作弊)

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

在此处输入图像描述 * 感谢@Denis Stafichuk @Karsten@autronix


此外,在现代 Postgres 中,您可以简单地转换:

SELECT md5(random()::text || clock_timestamp()::text)::uuid

于 2014-01-24T07:57:36.780 回答
96

Craig Ringer的回答是正确的。这是 Postgres 9.1 及更高版本的更多信息……</p>

扩展可用吗?

如果已经为您的 Postgres 安装(您的集群在 Postgres 术语中)构建了扩展,您只能安装它。例如,我发现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";

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

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

验证安装

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

SELECT * FROM pg_extension;

UUID 作为默认值

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

老路

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

UUID 的类型

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

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

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

于 2013-02-12T04:03:34.120 回答
79

pgcrypto扩大

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

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

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 doc onuuid-ossp module。

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

于 2015-02-08T16:40:04.520 回答
72

PostgreSQL 13 原生支持gen_random_uuid ()

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

gen_random_uuid () → uuid

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

db<>小提琴演示

于 2020-05-23T10:49:30.403 回答
23

从 2021 年开始更新,无需花哨的技巧即可自动生成uuidoninsert语句。

只做一件事:

  1. DEFAULT gen_random_uuid ()为您的uuid列设置默认值。就这些。

说,你有一张这样的桌子:

CREATE TABLE table_name (
    unique_id UUID DEFAULT gen_random_uuid (),
    first_name VARCHAR NOT NULL,
    last_name VARCHAR NOT NULL,
    email VARCHAR NOT NULL,
    phone VARCHAR,
    PRIMARY KEY (unique_id)
);

现在您无需执行任何操作即可将 uuid 值自动插入unique_id列。因为您已经为它定义了一个默认值。您可以简单地专注于插入其他列,并postgresql照顾您的unique_id. 这是一个示例插入语句:

INSERT INTO table_name (first_name, last_name, email, phone) 
VALUES (
    'Beki',
    'Otaev',
    'beki@bekhruz.com',
    '123-456-123'
)

请注意,没有插入unique_id,因为它已经被处理了。

关于其他的扩展,如对 postgres 的标准功能uuid-ossp不满意,可以开启。gen_random_uuid ()大多数时候,没有它们你应该没问题

于 2021-06-12T03:43:19.783 回答
3
ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);

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

于 2015-03-19T14:57:52.580 回答
1

uuid-ossp 模块提供生成通用唯一标识符 (UUID) 的功能

uuid_generate_v1() 此函数生成版本 1 UUID。

  1. 添加扩展

如果不存在“uuid-ossp”,则创建扩展;

  1. 验证扩展

选择 * 从 pg_extension;

  1. 运行查询

INSERT INTO table_name(id, column1, column2 , column3, ...) 值 (uuid_generate_v1(), value1, value2, value3...);

验证表数据

于 2021-09-02T12:05:32.400 回答