Postgresql

在 postgreSQL 中生成唯一 uuid 數組

  • August 11, 2021

我想以 uuid 列作為主鍵在表中插入唯一 uuid 值的數組。表結構是

CREATE TABLE Organisation (uuid id PRIMARY KEY DEFAULT uuid_generate_v4());

例如,我有 2 個組織,所以我試圖用查詢來實現它,看起來像

INSERT INTO Organisation (uuid) VALUES (unnest(array_fill(uuid_generate_v4()::uuid, ARRAY[2]))) RETURNING uuid as uuid_org;

它失敗了

ERROR: duplicate key value violates unique constraint "organisation_pkey"

因為查詢公平地嘗試插入兩個重複的非唯一值,例如

{711ec909-fc2c-45aa-8912-39207788768e,711ec909-fc2c-45aa-8912-39207788768e}

我的技巧在返回 ids 或uuids時有效,同時插入到不是唯一列的表中 - 我傳遞 uuid 列並查詢自動生成我可以聚合的唯一 uuids(請參閱下面的表 TimeSlice)。

一般來說,我的想法是使用WITH同時插入多個表:

WITH ins_ts as (INSERT INTO TimeSlice (validTimeBegin) VALUES 
            (unnest(array_fill('2020-01-02'::datetype, ARRAY[2])))
            RETURNING id as id_ts),
    ins_org AS (INSERT INTO Organisation (uuid) ... ---my fail query ),
INSERT INTO OrganisationTimeSlice (idTimeSlice, uuid, name) 
           VALUES (unnest(array(select array_agg(id_ts) from ins_ts)), 
   (unnest(array(select array_agg(uuid_org) from ins_org))),
                    unnest(array['name1', 'name2']));

我哪裡錯了?

為了澄清為什麼這需要是一個數組而不是例如明確地提供兩行這樣的:

INSERT INTO Organisation (uuid) VALUES (uuid_generate_v4()), (uuid_generate_v4())

這是因為我有可變數量的組織,我在ARRAY[number_of_organisations]. 因此我需要生成可變數量的 uuid。

注意:這最初是由a_horse_with_no_name在評論中建議的。

fds解決方案可以簡化為

select uuid_generate_v4() from generate_series(1,30);

假設您實際上並不希望它們在數組中,因為您要立即取消嵌套,以下是如何生成任意數量的 UUID 的表:

WITH RECURSIVE genx(n, uu) AS (
 VALUES (1, uuid_generate_v4())
 UNION ALL
 SELECT n + 1, uuid_generate_v4()
 FROM genx WHERE n < 30
) SELECT uu FROM genx;

將 30 更改為您想要的任意數量!

引用自:https://dba.stackexchange.com/questions/258426