2011-02-27 101 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