首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当自动生成的UUID主键在Postgres中碰撞时会发生什么?

当自动生成的UUID主键在Postgres中碰撞时会发生什么?
EN

Database Administration用户
提问于 2018-08-05 07:33:08
回答 1查看 4.7K关注 0票数 5

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

代码语言:javascript
运行
复制
id UUID PRIMARY KEY DEFAULT gen_random_uuid()

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

EN

回答 1

Database Administration用户

回答已采纳

发布于 2018-08-05 09:13:53

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

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

代码语言:javascript
运行
复制
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());

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

代码语言:javascript
运行
复制
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
SELECT uuid_generate_v1();

但这取决于您的usecase (不要将其用于密码/安全性)。

票数 5
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/214083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档