如果我有一个 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)
但这取决于您的用例(不要将其用于加密/安全)。
| 归档时间: |
|
| 查看次数: |
5824 次 |
| 最近记录: |