тип данных enum для liquibase

В настоящее время я работаю над файлом liquibase.xml для создания таблицы table_a. Одно из моих полей <column name="state" type="ENUM('yes','no')">. Я использую postgresql в качестве своей СУБД. есть ли что-нибудь вроде типа данных enum? Я читал об этом как http://wiki.postgresql.org/wiki/Enum

что postgresql не имеет такого типа данных. Функция CREATE TYPE используется для создания этого типа данных. Я до сих пор не знаю, как сделать это в liquibase.

Какие-либо предложения?


person Ali Taha Ali Mahboub    schedule 27.02.2011    source источник


Ответы (2)


Ну, конечно, у 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 вместо перечисления

person a_horse_with_no_name    schedule 27.02.2011
comment
Кажется, это говорит об обратном: gist.github.com/wilmoore/812253# файл-изменить-столбец-xml - person 1in9ui5t; 26.06.2015
comment
Также хорошей практикой является предоставление команды отката при выполнении пользовательского sql в liquibase. liquibase.org/documentation/rollback.html - person zudduz; 13.11.2017
comment
@ 1in9ui5t не работает!!! В документах Liquibase нет типа enum (docs.liquibase.com/ типы изменений/сообщество/). - person rios0rios0; 11.06.2021

Альтернативой созданию нового типа может быть простое ограничение CHECK для столбца varchar(3):

<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) было бы лучшим вызовом для этого конкретного случая: говорить именно то, что вы имеете в виду, обычно работает лучше, чем альтернативы.

person mu is too short    schedule 27.02.2011
comment
Я согласен: контрольное ограничение, вероятно, даже лучше, чем ENUM - person a_horse_with_no_name; 27.02.2011
comment
Вы можете использовать checkConstraint в соответствии с документами Liquibase: stackoverflow.com/ вопросы/38315020/ - person rios0rios0; 11.06.2021