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


当前回答

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

验证表数据

其他回答

SELECT uuid_generate_v5(uuid_ns_url (), 'test');

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

验证表数据

2021年起更新, 不需要在插入语句中自动生成uuid。

只做一件事:

将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,因为它已经被处理了。

关于其他扩展,如uuid-ossp,如果您对postgres的标准gen_random_uuid()函数不满意,可以启用它们。大多数时候,你不戴眼镜也没问题

PostgreSQL 13支持原生gen_random_uuid ():

PostgreSQL包含一个生成UUID的函数: Gen_random_uuid()→uuid 这个函数返回一个版本4(随机)UUID。这是最常用的UUID类型,适用于大多数应用程序。

db < > fiddle演示

ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);

在阅读@ZuzEL的回答后,我使用上面的代码作为列id的默认值,它工作得很好。