我的问题很简单。我知道一个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…);
验证表数据
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()函数不满意,可以启用它们。大多数时候,你不戴眼镜也没问题
没有扩展(作弊)
如果您需要一个有效的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);
感谢@Denis Stafichuk @Karsten和@autronix
或者你可以简单地通过这样做来获得类似uuid的值(如果你不关心有效性):
SELECT uuid_in(md5(random()::text || random()::text)::cstring);
output>> c2d29867-3d0b-d497-9191-18a9d8ee7830
(至少在8.4中有效)
pgcrypto扩展
从Postgres 9.4开始,pgcrypto模块包含gen_random_uuid()函数。这个函数生成一个基于随机数的版本4类型的UUID。
获取贡献模块(如果尚未可用)。
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文档中的uuid-ossp模块。
注意:如果您只需要随机生成的uuid(版本4),请考虑使用pgcrypto模块中的gen_random_uuid()函数。