ano*_*932 318 postgresql uuid postgresql-8.4
我的问题很简单.我知道UUID的概念,我想生成一个从我的DB中的'store'引用每个'item'.看似合理吧?
问题是以下行返回错误:
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.
Run Code Online (Sandbox Code Playgroud)
我已经阅读了以下网页:http://www.postgresql.org/docs/current/static/uuid-ossp.html

我在Ubuntu 10.04 x64上运行Postgres 8.4.
Cra*_*ger 391
uuid-ossp是一个contrib模块,因此默认情况下它不会加载到服务器中.您必须将其加载到数据库中才能使用它.
对于现代PostgreSQL版本(9.1和更新版本)来说,这很简单:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Run Code Online (Sandbox Code Playgroud)
但对于9.0及更低版本,您必须运行SQL脚本来加载扩展.请参阅8.4中的contrib模块文档.
对于Pg 9.1和更新版本,请阅读当前的contrib文档和CREATE EXTENSION.这些功能在9.0或更早版本中不存在,例如8.4.
如果您使用的是PostgreSQL的打包版本,则可能需要安装包含contrib模块和扩展的单独软件包.在您的包管理器数据库中搜索"postgres"和"contrib".
Zuz*_*zEL 254
SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);
output>> c2d29867-3d0b-d497-9191-18a9d8ee7830
Run Code Online (Sandbox Code Playgroud)
(至少在8.4中起作用)
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);
Run Code Online (Sandbox Code Playgroud)
*感谢@Denis Stafichuk @Karsten和@autronix
此外,在现代Postgres中,您可以简单地演员:
SELECT md5(random()::text || clock_timestamp()::text)::uuid
Bas*_*que 66
克雷格林格的答案是正确的.这是Postgres 9.1及更高版本的更多信息......
如果已经为Postgres安装(Postgres术语中的群集)构建了扩展,则只能安装扩展.例如,我发现UUID-OSSP包括作为麻烦安装的Mac OS X的一部分延伸设置由EnterpriseDB.com.可能有几十个扩展中的任何一个.
要查看Postgres集群中是否有uuid-ossp扩展,请运行此SQL以查询pg_available_extensions系统目录:
SELECT * FROM pg_available_extensions;
Run Code Online (Sandbox Code Playgroud)
要安装与UUID相关的扩展,请使用CREATE EXTENSION命令,如下面的SQL所示:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Run Code Online (Sandbox Code Playgroud)
注意:我发现要求扩展名称周围的QUOTATION MARK字符,尽管文档相反.
SQL标准委员会或Postgres团队为该命令选择了一个奇怪的名称.在我看来,他们应该选择"安装扩展"或"使用扩展"之类的东西.
您可以通过运行此SQL来查询pg_extension系统目录来验证扩展是否已成功安装在所需的数据库中:
SELECT * FROM pg_extension;
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅问题:Postgres中UUID列的默认值
以上信息使用Postgres 9.1中添加的新扩展功能.在以前的版本中,我们必须在.sql文件中查找并运行脚本.添加扩展功能是为了使安装更容易,为扩展的创建者交换更多的工作,以减少扩展的用户/消费者的工作.有关更多讨论,请参阅我的博文.
顺便说一句,问题中的代码调用该函数uuid_generate_v4().这将生成一种称为版本4的类型,其中几乎所有128位都是随机生成的.虽然这对于在较小的行集上的有限使用是好的,但如果您想要几乎消除任何冲突的可能性,请使用UUID的另一个"版本".
例如,原始版本1将主计算机的MAC地址与当前日期时间和任意数字组合在一起,碰撞的几率几乎为零.
bri*_*out 57
pgcrypto 延期截至Postgres 9.4,该pgcrypto模块包含该gen_random_uuid()功能.此函数生成一个基于随机数的版本4类型的UUID.
获取contrib模块(如果尚未提供).
sudo apt-get install postgresql-contrib-9.4
Run Code Online (Sandbox Code Playgroud)
使用pgcrypto模块.
CREATE EXTENSION "pgcrypto";
Run Code Online (Sandbox Code Playgroud)
该gen_random_uuid()功能现在应该可用;
用法示例.
INSERT INTO items VALUES( gen_random_uuid(), 54.321, 31, 'desc 1', 31.94 ) ;
Run Code Online (Sandbox Code Playgroud)
从Postgres doc上uuid-ossp引用模块.
注意:如果您只需要随机生成(版本4)UUID,请考虑使用pgcrypto模块中的gen_random_uuid()函数.
Luk*_*zda 38
的PostgreSQL 13支撑本身 gen_random_uuid() :
PostgreSQL 包括一个生成 UUID 的函数:
Run Code Online (Sandbox Code Playgroud)gen_random_uuid () ? uuid此函数返回版本 4(随机)UUID。这是最常用的 UUID 类型,适用于大多数应用程序。
从 2021 年开始更新,无需花哨的技巧来自动生成uuidoninsert语句。
只做一件事:
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)
);
Run Code Online (Sandbox Code Playgroud)
现在您无需执行任何操作即可将 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'
)
Run Code Online (Sandbox Code Playgroud)
注意没有插入,unique_id因为它已经被处理了。
关于其他扩展,如uuid-ossp,如果您对 postgres 的标准gen_random_uuid ()功能不满意,您可以使用它们。大多数时候,没有它们你应该没问题
小智 8
Postgres v13+
INSERT INTO your_table
VALUES (gen_random_uuid(), 'value column 2', 'value column 3')
Run Code Online (Sandbox Code Playgroud)
小智 5
ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);
Run Code Online (Sandbox Code Playgroud)
阅读@ZuzEL 的答案后,我使用上面的代码作为列 id 的默认值,并且工作正常。
小智 5
uuid-ossp 模块提供生成通用唯一标识符(UUID)的函数
uuid_generate_v1() 该函数生成版本 1 UUID。
如果不存在“uuid-ossp”,则创建扩展;
从 pg_extension 中选择*;
INSERT INTO table_name(id,column1,column2,column3,...)VALUES(uuid_generate_v1(),value1,value2,value3...);
验证表数据