在 Postgres 中添加枚举类型

发布于 2024-10-21 11:17:30 字数 367 浏览 0 评论 0原文

我正在尝试向 Postgres 数据库中的枚举类型添加新值,但该类型已被各个字段使用。 Postgres 不会让我这样做,因为该类型已经在使用中。

以前我通过以下方式完成此操作:

  1. 使用类型复制所有字段 到临时 varchar 字段,
  2. 使用以下命令删除所有字段和函数 类型、
  3. 删除类型、
  4. 使用额外的创建新类型 枚举值,
  5. 设置全部 临时字段和函数返回使用 枚举类型。

在任何情况下都是一项艰巨的任务,但如果该类型在整个数据库的表、视图和函数中使用数十次,那么这就是一项不可能完成的艰巨任务。当然一定有一种更简单的方法只是向枚举类型添加新值吗?

非常感谢您的帮助。

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:

  1. copying all fields using the type
    to a temporary varchar field,
  2. dropping all the fields and functions using the
    type,
  3. deleting the type,
  4. creating a new type with the extra
    enumerated value,
  5. 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

渡你暖光 2024-10-28 11:17:30

@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.

追星践月 2024-10-28 11:17:30

在新的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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文