PostgreSQL 中的 UPDATE 生成相同的 UUID

it'*_*tch 5 sql postgresql uuid sql-update

uuid我为我的一张表添加了新列并安装了uuid-ossp扩展。现在我想更新所有现有记录并为这个新uuid列设置值。

我不想对 ADD COLUMN 使用 DEFAULT 回退,而是想在 UPDATE 语句中执行此操作,所以我有这样的内容:

UPDATE table_name SET uuid = (SELECT uuid_generate_v4());
Run Code Online (Sandbox Code Playgroud)

但我遇到的问题是为所有记录生成相同的 UUID。

有没有办法传递种子值或生成函数的东西或其他方法来强制生成的 UUID 是唯一的?

Tim*_*sen 11

您可以尝试修改 UUID 子查询,以便强制/诱骗 Postgres 为每个记录生成新的 UUID:

UPDATE table_name
SET uuid = uuid_generate_v4()
WHERE uuid IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

WHERE子句只是一个虚拟子句,但可能会导致 Postgres 对每个记录调用一次 UUID 函数。

  • @whatamidoingwithmylife 正确。Postgres 认为它​​可以帮助您认识到它只需执行一次非相关子查询,然后缓存并重用结果。但就您而言,您实际上不希望出现这种行为。 (3认同)

Lau*_*lbe 7

如果您uuid_generate_v4()在子查询中调用该函数,PostgreSQL 将假定该子查询只需调用一次,因为它不包含对周围查询的任何引用。因此,所有行都将更新为相同的uuid,这会失败。

如果删除子查询并仅保留函数调用,则将为每一行调用该函数,因为它是VOLATILE.