Postgresql 必须先提交新的枚举值,然后才能使用它们

Postgresql 必须先提交新的枚举值,然后才能使用它们,postgresql,enums,Postgresql,Enums,我正在将PostgreSQL从9.6升级到13。 以下脚本适用于9.6: BEGIN CREATE TYPE x AS ENUM ('foo', 'bar'); ALTER TYPE x ADD VALUE 'baz'; SELECT 'baz'::x; END; 但在13日结束时: ERROR: unsafe use of new value "baz" of enum type x LINE 1: SELECT 'baz'::x; ^

我正在将PostgreSQL从9.6升级到13。 以下脚本适用于9.6:

BEGIN

CREATE TYPE x AS ENUM ('foo', 'bar');
ALTER TYPE x ADD VALUE 'baz';
SELECT 'baz'::x;

END;
但在13日结束时:

ERROR:  unsafe use of new value "baz" of enum type x
LINE 1: SELECT 'baz'::x;
               ^
HINT:  New enum values must be committed before they can be used.
谷歌建议这比13早,但我不知道确切的版本

我很确定我有很好的理由创建enum,添加值并在同一事务中使用该值。问题最后的细节

是否有任何已知的清洁工作区

[EDIT]-我为什么要这样做

我有一组SQL文件

v_0.01.sql
v_0.02.sql
v_0.03.sql
...
是增量的,即“数据库版本X”包含在“X之前的所有SQL文件”中,例如,版本0.02与

cat v_0.01.sql v_0.02.sql | psql -1
其中一些文件包含
CREATE TYPE
s,另一些文件包含
ALTER TYPE
s。我可能会在将来的文件中添加更多这些内容

这很方便,因为在任何特定时刻,我都可以轻松地:

  • 在任何所需版本中安装新数据库
  • 将数据库从任何版本升级到任何其他版本
  • 检查版本之间的差异
在9.6上,第二个dot需要更多的努力——即在事务之外执行任何
altertype
s。在13上,第一次操作也需要这样做,这很不方便,因为我更经常这样做,而且总SQL也更多,所以更多的
altertype
s

我想保留:

  • 当前文件结构
  • 轻松安装fresh数据库
  • 单事务安装(
    psql-1
    )-这样我就不会将正确的安装与失败的安装混淆
已经进入状态

改变类型。。。ADD VALUE
(向枚举类型添加新值的表单)不能在事务块内执行

在同一事务中创建枚举时,此规则似乎存在未记录的异常。这根本不应该奏效

自Postgres 12以来,现在支持在事务期间添加新值,但不支持在同一事务中使用新值:

  • 允许更灵活地添加枚举值(Andrew Dunstan、Tom Lane、Thomas Munro)

    以前,
    altertype。。。无法在中调用ADD VALUE
    事务块,除非它是 创建枚举类型。现在,它可以在以后调用 事务,只要未引用新枚举值 直到它被提交之后

()

这项规则的改变似乎弥补了你所使用的漏洞


至于解决方法,您可能希望使用一个临时表来存储枚举,并仅在事务的最后创建枚举类型。请看一下(哪些文档预先提供了
增值
解决方案)以获得灵感。

是的,请详细说明您的用例,因为这将允许我们提出最明智的解决办法。@Bergi我只是做了一些工作。
psql-1f v_0.01.sql&&psql-1f v_0.02.sql
不是您的选择?这有一些缺点-例如,在某些阶段,使用包含所有43个文件的单个文件更方便,例如
db_从_7.01_升级到_7.43
,但我会这样做当然,如果没有更好的方法,就要考虑这个问题。