PostgreSQL中的更新生成相同的UUID
我为我的一个表添加了新的PostgreSQL中的更新生成相同的UUID,sql,postgresql,sql-update,uuid,Sql,Postgresql,Sql Update,Uuid,我为我的一个表添加了新的uuid列,并安装了uuid-ossp扩展。 现在我想更新所有现有记录,并为这个新的uuid列设置值 我不想对ADD COLUMN使用默认回退,而是想在UPDATE语句中使用它,所以我有如下内容: UPDATE table_name SET uuid = (SELECT uuid_generate_v4()); 但我遇到的问题是,为所有记录生成相同的UUID 是否有一种方法可以传递种子值或生成函数的内容,或者有另一种方法强制生成的UUID是唯一的?您可以尝试修改UUID
uuid
列,并安装了uuid-ossp
扩展。
现在我想更新所有现有记录,并为这个新的uuid
列设置值
我不想对ADD COLUMN使用默认回退,而是想在UPDATE语句中使用它,所以我有如下内容:
UPDATE table_name SET uuid = (SELECT uuid_generate_v4());
但我遇到的问题是,为所有记录生成相同的UUID
是否有一种方法可以传递种子值或生成函数的内容,或者有另一种方法强制生成的UUID是唯一的?您可以尝试修改UUID子查询,以便它强制/诱使Postgres为每个记录生成新的UUID:
更新表\u名称
设置uuid=uuid\u生成\u v4()
其中uuid不为NULL;
WHERE
子句只是一个伪子句,但可能会导致Postgres为每个记录调用一次UUID函数。您可以尝试修改UUID子查询,以便它强制/欺骗Postgres为每个记录生成新的UUID:
更新表\u名称
设置uuid=uuid\u生成\u v4()
其中uuid不为NULL;
WHERE
子句只是一个伪子句,但可能会导致Postgres为每个记录调用一次UUID函数。如果在子查询中调用UUID\u generate\u v4()
函数,PostgreSQL将假定子查询只需调用一次,因为它不包含对周围查询的任何引用。因此,所有行都将更新为相同的uuid
,但失败
如果删除子查询并只保留函数调用,则会为每一行调用该函数,因为它是易变的,如果在子查询中调用
uuid\u generate\u v4()
函数,PostgreSQL将假定该子查询只需调用一次,因为它不包含对周围查询的任何引用。因此,所有行都将更新为相同的uuid
,但失败
如果删除子查询并只保留函数调用,则会为每一行调用该函数,因为它是
VOLATILE
谢谢。事实证明,我所要做的就是从子查询中删除“SELECT”。我猜它做了一些缓存之类的事情?@whatamidong with mylife Correct。Postgres认为它可以帮助您实现只执行一次不相关的子查询,然后缓存和重用结果。除了在你的情况下,你实际上不想那样做。谢谢。事实证明,我所要做的就是从子查询中删除“SELECT”。我猜它做了一些缓存之类的事情?@whatamidong with mylife Correct。Postgres认为它可以帮助您实现只执行一次不相关的子查询,然后缓存和重用结果。除了在你的情况下,你实际上不想要那种行为。