在 Postgres 中添加枚举类型
我正在尝试向 Postgres 数据库中的枚举类型添加新值,但该类型已被各个字段使用。 Postgres 不会让我这样做,因为该类型已经在使用中。
以前我通过以下方式完成此操作:
- 使用类型复制所有字段 到临时 varchar 字段,
- 使用以下命令删除所有字段和函数 类型、
- 删除类型、
- 使用额外的创建新类型 枚举值,
- 设置全部 临时字段和函数返回使用 枚举类型。
在任何情况下都是一项艰巨的任务,但如果该类型在整个数据库的表、视图和函数中使用数十次,那么这就是一项不可能完成的艰巨任务。当然一定有一种更简单的方法只是向枚举类型添加新值吗?
非常感谢您的帮助。
I'm trying to add a new value to an enumerated type in my Postgres database but the type is already in use by various fields. Postgres won't let me do this as the type is already in use.
Previously I've accomplished this by:
- copying all fields using the type
to a temporary varchar field, - dropping all the fields and functions using the
type, - deleting the type,
- creating a new type with the extra
enumerated value, - Setting all
the temp fields and functions back to use the
enumerated type.
A big job in any situation, but an impossibly big task if the type is used in dozens of times throughout the DB in tables, views and functions. Surely there must be an easier way just to merely add a new value to an enumerated type?
Many thanks for any help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
@a_horse_with_no_name 涵盖了解决此问题的最佳方法。如果完整的重新架构不符合您的喜好,您可以利用 PostgreSQL 对 DDL 和 DML 操作中事务的支持。
因此,理论上,您可以在单个事务操作中执行所有五个步骤。由于 MVCC,您将能够安全地进行此更改,并且对数据库用户的功能影响最小。您可能会产生巨大的磁盘开销(取决于表的大小)和大量的数据库膨胀(如果事务需要很长时间,真空过程将无法运行)。
综上所述,这是完全可行的。
@a_horse_with_no_name covered the optimal way to solve this problem. If a complete re-architecture doesn't suit your fancy, you can take advantage of PostgreSQL's support for transactions in both DDL and DML operations.
So you could, in theory, perform all five of your steps in a single transactional operation. Because of MVCC you will be able to safely make this change and have a minimal functional impact to users of your database. You'll probably incur a huge disk overhead (depending on the size of the tables) and substantial database bloat (if the transaction takes a lot time, the vacuum process won't run).
All of that being said, it's perfectly doable.
在新的9.1版本中将会有一个简单的方法:
http://developer.postgresql.org/pgdocs/postgres/sql-altertype.html
There will be an easy way in the new 9.1 version:
http://developer.postgresql.org/pgdocs/postgres/sql-altertype.html