Liquibase的枚举数据类型

18
我正在使用liquibase.xml文件创建表table_a,其中一个字段是<column name="state" type="ENUM('yes','no')">。我使用postgresql作为我的DBMS。是否有枚举数据类型?我在这个链接http://wiki.postgresql.org/wiki/Enum中了解到postgresql没有这样的数据类型。CREATE TYPE函数用于创建这种数据类型。但我仍然不知道如何在liquibase中实现它。有什么建议吗?
2个回答

29

当然,PostgreSQL有一个枚举类型(在您提供的链接和手册中都有明确的文档)。

我认为Liquibase不“本地”支持PostgreSQL的枚举,但您应该能够通过自定义SQL语句实现:

<changeSet id="1" author="Arthur">
  <sql>CREATE TYPE my_state AS ENUM ('yes','no')</sql>
  <table name="foo">
    <column name="state" type="my_state"/>
  </table>
</changeSet>

对于一个简单的yes/no列,我实际上会使用boolean类型而不是枚举。


3
看起来这似乎表明不同的结论:https://gist.github.com/wilmoore/812253#file-modify-column-xml - 1in9ui5t
1
此外,在使用Liquibase进行自定义SQL时,提供回滚命令是一个好的实践。http://www.liquibase.org/documentation/rollback.html - zudduz
1
@1in9ui5t 不起作用!!!Liquibase文档中没有“枚举”类型(https://docs.liquibase.com/change-types/community/add-column.html#Informa)。 - rios0rios0

5

创建新类型的替代方法是在varchar(3)列上添加一个简单的CHECK约束:

<changeSet id="1" author="X">
    <table name="t">
        <column name="c" type="varchar(3)"/>
    </table>
    <sql>ALTER TABLE t ADD CONSTRAINT check_yes_no CHECK (c = 'yes' OR c = 'no')</sql>
</changeSet>

这可能在客户端效果更好,也可能不是。我认为在这种特定情况下,像a_horse_with_no_name建议的那样使用布尔值会更好:通常直说比其他选择更有效。


我同意:检查约束可能比ENUM甚至更好。 - user330315
1
您可以根据Liquibase文档使用"checkConstraint": https://dev59.com/bZjga4cB1Zd3GeqPP9UF - rios0rios0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接