2011-02-27 97 views
8

我目前正在使用liquibase.xml文件来创建表table_a。我的一个领域是<column name="state" type="ENUM('yes','no')"> 我使用postgresql作为我的DBMS。有什么像枚举数据类型? 我读过这个像http://wiki.postgresql.org/wiki/Enumliquibase的enum数据类型

PostgreSQL所不具备这样的数据类型。 CREATE TYPE函数用于创建此数据类型。尽管如此,我仍然不知道如何在liquibase中制作。

有什么建议吗?

回答

14

当然,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> 

对于一个简单的是/否列,其实我使用boolean类型,而不是一个枚举的

+1

这似乎是另有建议:https://gist.github.com/wilmoore/812253#file-modify-column-xml – 1in9ui5t 2015-06-26 17:14:44

+0

另外它是在liquibase中执行自定义sql时提供回滚命令的好习惯。 http://www.liquibase.org/documentation/rollback.html – zudduz 2017-11-13 18:42:45

1

创建新类型的替代将是对一个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> 

这对客户端来说可能会更好,或者不会。我认为boolean(正如a_horse_with_no_name所建议的)对于这个特定情况将会是一个更好的要求:确切地说,你的意思通常比替代方案更好。

+0

我同意:检查约束可能比ENUM更好 – 2011-02-27 19:02:51

+0

@a_horse_with_no_name:但是'boolean'可能比'CHECK'更好,只要客户端方可以很容易地理解数据库中的一个'boolean'。为了记录:我喜欢CHECK约束,几乎和我喜欢FK一样多;一个高度受限的数据库是你的朋友。 – 2011-02-27 20:21:56

+0

我完全同意;) – 2011-02-27 20:45:40