postgresql 使用Postgres为表中的每一行生成唯一的uuid

gdrx4gfi  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(2)|浏览(487)

我在我的一个表中设置了一个UUID约束作为我的ID字段,但是尽管如此(我认为是由于uuid_generate_v4仅为每个事务创建UUID?),当我将CSV数据加载到我的表中时,表中的每一行都被赋予了相同的UUID。
我希望能够更改此设置,并为每行指定一个唯一的UUID,无论运行
update monitors_nontest set id = uuid_generate_v1()
同样,每行只生成一个UUID。
如何更改此命令,使每行都获得不同的UUID?

afdcj2ne

afdcj2ne1#

只是一种可能性。你实际上是如何生成uuid的?函数uuid_generate_v1()实际上每次被调用时都会生成一个不同的值。但每次调用时都会生成一个键。看起来如果在sub select中调用,Postgres优化器可能会觉得它可以绕过调用并使用缓存的结果。尝试以下操作。

create table uuid_gen( id1a uuid
                     , id1b uuid
                     , num1 integer
                     );
                 
insert into uuid_gen(num1) 
  select generate_series(1,50);

update uuid_gen set id1a = uuid_generate_v1();
update uuid_gen set id1b = (select uuid_generate_v1());

select count(distinct id1a), count(distinct id1b) from uuid_gen;

不幸的是,我找不到一个有uuid_generate_v1()函数的fiddle处理器,也找不到工作完全相同的uuid_generate_v4()函数。

f1tvaqid

f1tvaqid2#

我有不完全相同的问题,但类似的东西。我正在与pre-Postgres 13版本(所以我没有任何功能准备).
我有一个表,需要在表中插入新行,同时为每个新行生成一个新的UUID(v4)。
我到处找,但找不到任何W/O创建功能或安装扩展。
所以我这样做了:

INSERT INTO monitors_nontest (id, col1, col2, col3)
SELECT uuid_in(md5(random()::text || random()::text)::cstring), mn.col1, mn.col2, mn.col3 
FROM monitors_nontest mn
WHERE mn.col1 = 'some-text'

这可以针对UPDATE查询进行调整。我希望它能对其他人有所帮助。

相关问题