我需要自动更改 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;
除了视图问题之外,这种技术还会出现什么问题?
- Any other objects dependencies. For example,
- 您可能会遇到暂时性错误与 oid XXX 的关系不存在.
- 如果表被分区/继承,子分区也将被锁定。
我会认真考虑使用 DELETE / INSERT 模式而不是 RENAME / TRUNCATE 模式。
特别是如果您未来的计划包括分区、逻辑或基于触发器的复制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)