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

qni6mghb  于 2023-02-04  发布在  PostgreSQL
关注(0)|答案(9)|浏览(445)

我的问题很简单。我知道UUID的概念,我想生成一个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。

jfewjypa

jfewjypa1#

uuid-ossp是一个contrib模块,所以默认情况下不会加载到服务器中,必须加载到数据库中才能使用。
对于现代PostgreSQL版本(9.1及更新版本),这很容易:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

但是对于9.0和更低版本,您必须运行SQL脚本来加载扩展。请参阅the documentation for contrib modules in 8.4
对于9.1和更新版本,请改为the current contrib docsCREATE EXTENSION。这些功能在9.0或更早的版本中不存在,比如8.4。
如果您使用的是打包版本的PostgreSQL,您可能需要安装一个包含contrib模块和扩展的单独软件包。请在您的软件包管理器数据库中搜索'postgres'和'contrib'。

vawmfj5a

vawmfj5a2#

无扩展(作弊)

如果需要有效的v4 UUID

SELECT uuid_in(overlay(overlay(md5(random()::text || ':' || random()::text) placing '4' from 13) placing to_hex(floor(random()*(11-8+1) + 8)::int)::text from 17)::cstring);

  • 感谢**@丹尼斯·斯塔菲丘克****@卡斯滕@autronix**

或者你可以简单地通过这样做来获得类似UUID的值(如果你不关心有效性的话):

SELECT uuid_in(md5(random()::text || random()::text)::cstring);

output>> c2d29867-3d0b-d497-9191-18a9d8ee7830
  • (至少在8.4中有效)*
tpgth1q7

tpgth1q73#

PostgreSQL 13 * 本机 * 支持gen_random_uuid ()
PostgreSQL包含一个生成UUID的函数:

gen_random_uuid () → uuid

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

    • 第一个e第一个f第一个x
gpnt7bae

gpnt7bae4#

answer by Craig Ringer是正确的。这里有更多关于Postgres 9.1和更高版本的信息...

分机号可用吗?

您只能安装一个扩展,如果它已经为您的Postgres安装(您的 * 集群 * 在Postgres行话)。例如,我发现uuid-ossp扩展包括作为Mac OS X安装程序的一部分,由EnterpriseDB.com善意provided。任何few dozen extensions都可能可用。
要查看 uuid-ossp 扩展在Postgres集群中是否可用,请运行以下SQL查询pg_available_extensions系统目录:

SELECT * FROM pg_available_extensions;

安装扩展

要安装与UUID相关的扩展,请使用CREATE EXTENSION命令,如下SQL所示:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

**注意:**我发现扩展名周围需要引号字符,尽管文档中有相反的规定。

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

验证安装

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

SELECT * FROM pg_extension;

UUID作为默认值

有关详细信息,请参阅问题:Default value for UUID column in Postgres
∮古老的方式∮
上面的信息使用了Postgres 9.1新增的 Extensions 特性。在以前的版本中,我们必须在 .sql 文件中查找并运行脚本。添加Extensions特性是为了使安装更容易,用creator of an extension的更多工作来换取扩展的用户/消费者的更少工作。更多讨论请参见我的blog post

UUID的类型

顺便说一下,Question中的代码调用了函数uuid_generate_v4()。这将生成一个称为Version 4的类型,其中几乎所有的128位都是随机生成的。虽然这对于在较小的行集上的有限使用是可以的,但如果您想实际上消除任何冲突的可能性,请使用UUID的另一个“版本”。
例如,原始版本1将主机的MAC address与当前日期-时间和任意数字组合,冲突的机会实际上为零。
有关更多讨论,请参见相关问题中的my Answer

7ivaypg9

7ivaypg95#

pgcrypto延伸导线

从Postgres 9.4开始,pgcrypto模块包含了gen_random_uuid()函数,这个函数生成一个基于随机数的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 on uuid-ossp模块。
注意:如果您只需要随机生成的(版本4)UUID,请考虑使用pgcrypto模块中的gen_random_uuid()函数。

pkln4tw6

pkln4tw66#

自2021年更新,无需花哨的技巧即可在insert语句上自动生成uuid
只做一件事:
1.将DEFAULT gen_random_uuid ()的默认值设置为uuid列。仅此而已。
比如说,你有这样一张table:

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 ()功能不满意,你可以启用它们。大多数时候,你不启用它们也没问题 *
nmpmafwu

nmpmafwu7#

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

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

z18hc3ub

z18hc3ub8#

uuid-ossp模块提供生成通用唯一标识符(UUID)的函数
uuid_generate_v1()此函数用于生成版本1的UUID。
1.添加扩展名
如果不存在,则创建扩展"uuid-ossp";
1.验证延伸导线
SELECT * 从pg_扩展;
1.运行查询
INSERT INTO表名(标识,列1,列2,列3,...)值(uuid_generate_v1(),值1,值2,值3 ...);
验证表数据

qzwqbdag

qzwqbdag9#

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

相关问题