【问题标题】:Is it possible to create an ENUM of smallints in postgres 11.x?是否可以在 postgres 11.x 中创建一个 ENUM 小整数?
【发布时间】:2020-03-04 22:23:47
【问题描述】:

我想创建一个枚举类型来约束 pl/pgsql 函数接受 1、2 或 3 的参数。枚举类型似乎是解决这个问题的方法。

我尝试如下创建我的枚举:

CREATE TYPE my_enum AS ENUM ('1'::smallint, '2'::smallint);
/*                           ^ syntax error here         */

【问题讨论】:

    标签: sql postgresql enums postgresql-11


    【解决方案1】:

    根据PostgreSQL documentationENUM 类型始终是一个固定值:

    一个枚举值占用磁盘上的四个字节。枚举值的文本标签的长度受编译到 PostgreSQL 中的NAMEDATALEN 设置的限制;在标准版本中,这意味着最多 63 个字节。

    因此,您不能将其转换为 smallint -- 抱歉!

    相反,如果您关心空间,我想您可以创建一个引用表并创建一个外键约束。

    披露:我为EnterpriseDB (EDB)工作

    【讨论】:

    • 4 个字节!?在什么情况下需要支持 42 亿个枚举值?我什至从未见过 mysql 数据库最大 mysql 的 2 字节枚举(最多 65534+null 值)
    • 这不是因为需要值的数量。枚举的数据类型是 REAL。因此 4 个字节。通过使用实数 Postgres 可以“...adds a new value 到枚举类型。新值在枚举排序中的位置可以指定为现有值之一之前或之后”
    猜你喜欢
    • 1970-01-01
    • 2011-10-29
    • 2012-12-01
    • 2013-07-11
    • 1970-01-01
    • 2023-04-09
    • 2021-05-06
    • 2014-05-15
    • 1970-01-01
    相关资源
    最近更新 更多