我需要连续迁移两个非常大的表。我的第一个解决方案是逐列比较以找出哪些发生了更改,但这样做成本太高。
所以第二个想法是创建持久化计算列来存储集合列的散列值。这可以加快处理速度。但问题是,使用带时区的时间戳对列进行散列时出现了问题。我收到了这个错误:ERROR: generation expression is not immutable
。
我尝试了各种方法来转换值,但都不起作用。
代码(注释值,无效):
ALTER TABLE schema.table ADD COLUMN hashed_columns UUID GENERATED ALWAYS AS (
md5(
id::text ||
type_id::text ||
--EXTRACT(EPOCH FROM date)::text ||
-- to_char(date::timestamp without time zone , 'YYYY-MM-DD"T"HH24:MI:SS') ||
-- date::text ||
-- to_char(date, 'YYYYMMDD')::integer ||
-- md5(date::text) ||
to_char(date, 'YYYYMMDD') ||
value1::text ||
value2::text
)::uuid
) STORED;
看起来,它检测到了不可变列,然后直接抛出错误,而没有先尝试强制类型转换。我尝试做的事情从根本上来说错了吗?还是说有可能?
当我从脚本中删除日期列时,它可以工作,所以问题出在时间戳内。
服务器正在运行 Postgre 16。