在 Postgresql 中使用表重命名交换表内容时会出现什么问题?

2024-03-21

我需要自动更改 Postgresql 表中的大量行。我正在使用这样的技术:将数据添加到临时表,然后通过将 Original 重命名为 not_matter_name 并将 temp 重命名为原始名称来交换表。该技术已描述here https://dba.stackexchange.com/questions/100779/how-to-atomically-replace-table-data-in-postgresql.

但这种方法被打破了。例如,我发现视图不会更新指向新表的指针,即使在名称交换后仍然指向旧表。我发现的唯一解决方案是重新创建视图,这有点糟糕。

除了视图问题之外,这种技术还会出现什么问题?

我总体上做错了什么吗?有没有更好的解决方案来快速交换表,并且不会对其他 Postgresql 实体造成像这样的副作用?


代码如下所示:

CREATE TABLE _temp_with_updated_data (like original_name including all);

--...MANY INSERTS TO _temp_with_updated_data

begin;
alter table original_name rename to ___doesnt_matter;
alter table _temp_with_updated_data rename to original_name;
alter table ___doesnt_matter to _temp_with_updated_data;
truncate table _temp_with_updated_data;
commit;

除了视图问题之外,这种技术还会出现什么问题?

  1. Any other objects dependencies. For example,
    • 表“拥有”的序列。
    • 出版物和订阅
    • 触发器。
  2. 您可能会遇到暂时性错误与 oid XXX 的关系不存在.
  3. 如果表被分区/继承,子分区也将被锁定。

我会认真考虑使用 DELETE / INSERT 模式而不是 RENAME / TRUNCATE 模式。

特别是如果您未来的计划包括分区、逻辑或基于触发器的复制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Postgresql 中使用表重命名交换表内容时会出现什么问题? 的相关文章

随机推荐