如果我有一个PostgreSQL表,其列定义如下,其中gen_random_uuid()
来自扩展pgcrypto
。
id UUID PRIMARY KEY DEFAULT gen_random_uuid()
在未指定UUID的每次插入时,将自动生成一个新UUID (v4),将其设置为主键。但由于UUIDv4是随机产生的,它可能(在极低的几率下)与现有行的UUID发生碰撞。在这种情况下会发生什么?插入返回时会出现重复的键错误,还是会重复生成,直到找到不发生冲突的UUID?
发布于 2018-08-05 09:13:53
不,它不会重试,因此会引发重复的键错误。
您可以使用以下代码亲自测试它:
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。
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
SELECT uuid_generate_v1();
但这取决于您的usecase (不要将其用于密码/安全性)。
https://dba.stackexchange.com/questions/214083
复制相似问题