2011-03-13 249 views
0

我想在我的Postgres数据库中为枚举类型添加一个新值,但该类型已被各个字段使用。由于该类型已被使用,Postgres不会让我这样做。在Postgres中添加枚举类型

以前我已经做到了这一点:

  1. 使用类型 到一个临时varchar字段复制所有领域,
  2. 删除所有领域,并使用 型功能,
  3. 删除
  4. 创建一个新的类型与额外 枚举值,
  5. 设置全部 临时字段和函数返回使用枚举类型 。

在任何情况下都是一份很棒的工作,但如果在整个数据库中使用表格,视图和功能的类型数十次,这是一项不可能完成的重大任务。当然,为了仅为枚举类型添加一个新值,肯定有一个更简单的方法?

非常感谢您的帮助。

+0

这可能不是您想要听到的答案:但这是您为非标准化设计付出的代价。将你的枚举值移到一个单独的表中并为其创建一个外键。添加一个新值就像向表中添加新行一样简单。 – 2011-03-13 23:06:39

回答

1

@a_horse_with_no_name覆盖,以解决这一问题的最佳方式。如果一个完整的重新架构不适合您的想法,您可以利用PostgreSQL对DDL和DML操作中的事务的支持。

因此,您理论上可以在单个事务操作中执行所有五个步骤。由于MVCC,您将能够安全地进行此更改并对数据库用户产生最小的功能影响。您可能会承担巨大的磁盘开销(取决于表的大小)和实质性数据库膨胀(如果事务需要很长时间,真空过程将不会运行)。

所有这些被说,这是完全可行的。