PostgreSQL 中的 UPDATE 生成相同的 UUID
UPDATE in PostgreSQL generates same UUID
我为我的一张表添加了新的 uuid
列并安装了 uuid-ossp
扩展。
现在我想更新所有现有记录并为这个新的 uuid
列设置值。
我不想对 ADD COLUMN 使用 DEFAULT 回退,而是想在 UPDATE 语句中使用它,所以我有这样的东西:
UPDATE table_name SET uuid = (SELECT uuid_generate_v4());
但我遇到的问题是为所有记录生成相同的 UUID。
有没有办法传递种子值或其他东西来生成函数或其他方法来强制生成的 UUID 是唯一的?
您可以尝试修改 UUID 子查询,使其 forces/tricks Postgres 为每条记录生成一个新的 UUID:
UPDATE table_name
SET uuid = uuid_generate_v4()
WHERE uuid IS NOT NULL;
WHERE
子句只是一个虚拟子句,但可能会导致 Postgres 为每条记录调用一次 UUID 函数。
如果您在子查询中调用 uuid_generate_v4()
函数,PostgreSQL 将假设该子查询只需要调用一次,因为它不包含对周围查询的任何引用。因此,所有行都将更新为相同的 uuid
,但失败了。
如果删除子查询并只保留函数调用,则为每一行调用该函数,因为它是 VOLATILE
。
我为我的一张表添加了新的 uuid
列并安装了 uuid-ossp
扩展。
现在我想更新所有现有记录并为这个新的 uuid
列设置值。
我不想对 ADD COLUMN 使用 DEFAULT 回退,而是想在 UPDATE 语句中使用它,所以我有这样的东西:
UPDATE table_name SET uuid = (SELECT uuid_generate_v4());
但我遇到的问题是为所有记录生成相同的 UUID。
有没有办法传递种子值或其他东西来生成函数或其他方法来强制生成的 UUID 是唯一的?
您可以尝试修改 UUID 子查询,使其 forces/tricks Postgres 为每条记录生成一个新的 UUID:
UPDATE table_name
SET uuid = uuid_generate_v4()
WHERE uuid IS NOT NULL;
WHERE
子句只是一个虚拟子句,但可能会导致 Postgres 为每条记录调用一次 UUID 函数。
如果您在子查询中调用 uuid_generate_v4()
函数,PostgreSQL 将假设该子查询只需要调用一次,因为它不包含对周围查询的任何引用。因此,所有行都将更新为相同的 uuid
,但失败了。
如果删除子查询并只保留函数调用,则为每一行调用该函数,因为它是 VOLATILE
。