当自动生成的 UUID 主键在 Postgres 中发生冲突时会发生什么?

fan*_*ere 8 postgresql

如果我有一个 PostgreSQL 表,其列定义如下,其中gen_random_uuid()来自扩展名pgcrypto.

id UUID PRIMARY KEY DEFAULT gen_random_uuid()
Run Code Online (Sandbox Code Playgroud)

每次插入时,如果未指定 UUID,则会自动生成一个新的 UUID (v4) 以将其设置为主键。但由于 UUIDv4 是随机生成的,它可能(概率极低)与现有行的 UUID 发生冲突。在这种情况下会发生什么?插入是否返回重复键错误,或者重复生成直到找到不冲突的 UUID?

小智 7

不,它不会重试,因此会引发重复键错误。

您可以使用以下代码自行测试:

CREATE OR REPLACE FUNCTION random_uuid() RETURNS uuid AS $$
        BEGIN
            IF random() > 0.5 THEN
                RETURN '35d4b5e2-8fb5-4b89-9874-62b572c8fa2b'::uuid;
            ELSE
                RETURN gen_random_uuid();
            END IF;
        END;
$$ LANGUAGE plpgsql;

CREATE TABLE test (id uuid default random_uuid() Primary key, date timestamp);

INSERT INTO test (date) VALUES (now());
INSERT INTO test (date) VALUES (now());
INSERT INTO test (date) VALUES (now());
Run Code Online (Sandbox Code Playgroud)

如果您想避免冲突,您可能需要使用 v1(基于时间)uuid。

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
SELECT uuid_generate_v1();
Run Code Online (Sandbox Code Playgroud)

但这取决于您的用例(不要将其用于加密/安全)。