Как заменить тип enum в базе данных H2? - PullRequest
10 голосов
/ 20 февраля 2012

MySQL диалект:

CREATE TABLE My_Table ( my_column enum ('first', 'second', ... 'last'));

H2 диалект:

CREATE TABLE My_Table ( my_column ? ('first', 'second', ... 'last'));

Какой тип в H2 эквивалентен типу enum из MySQL?

Ответы [ 5 ]

9 голосов
/ 20 февраля 2012

Я не уверен, что это то, что вы ищете, но вы могли бы использовать ограничение проверки:

CREATE TABLE My_Table(my_column varchar(255) 
    check (my_column in ('first', 'second', 'last')));

-- fails:
insert into My_Table values('x');

-- ok:
insert into My_Table values('first');

Это будет работать в H2, Apache Derby, PostgreSQL, HSQLDB,и даже SQLite.Я не проверял другие базы данных.

8 голосов
/ 20 февраля 2012

Там нет ни одного; Тем не менее, enum не является хорошим решением в любом случае, просто используйте справочную таблицу.

4 голосов
/ 09 октября 2017

Похоже, что H2 имеет перечисления: http://www.h2database.com/html/datatypes.html#enum_type

Так что тот же самый синтаксис должен работать.(Я не знаю, насколько близка семантика.)

3 голосов
/ 03 января 2018

Обновление h2 jar

H2 maven репозиторий: https://mvnrepository.com/artifact/com.h2database/h2

jar версии:

1.4.196 Central (июнь, 2017) - поддержка enum (протестировано)

1.4.192 Central (май 2016 г.) - отсутствие поддержки enum (также проверено)

2 голосов
/ 15 июля 2017

Я столкнулся с этой проблемой и решил ее, создав отдельную таблицу и ограничение внешнего ключа.

CREATE TABLE My_Enum_Table (
    my_column varchar(255) UNIQUE
);

INSERT INTO My_Enum_Table (my_column)
VALUES
    ('First'),
    ('Second'),
    ...
    ('Last');

CREATE TABLE My_Table (
   my_column varchar(255),
   FOREIGN KEY (my_column) REFERENCES My_Enum_Table (my_column)
);

Таким образом, когда вы пытаетесь сделать INSERT в My_Table, он будет делать чужойпроверка ключа, чтобы убедиться, что вводимое вами значение находится в My_Enum_Table.

Здесь есть некоторые компромиссы:

  • PROS
    • Вы можетепо-прежнему взаимодействуя с этим так же, как с ENUM.
    • Вы также получаете немного дополнительной гибкости в том смысле, что вы можете добавить другое значение без необходимости изменять определения таблицы.
  • CONS
    • Это, вероятно, медленнее, чем ENUM, так как он должен искать в таблице.Реально, хотя, так как в таблице должно быть достаточно небольшое количество строк, это, вероятно, довольно незначительно.В этом может помочь добавление индекса к My_Table.my_column.
    • Это предотвращает необходимость объединения с справочной таблицей, но в основном с той же степенью сложности с точки зрения базы данных.Хотя это, вероятно, не имеет большого значения, если только вы не беспокоитесь о загромождении своей базы данных другой таблицей.
    • Для этого также необходимо использовать механизм, поддерживающий внешние ключи, например INNODB.Я не уверен, действительно ли это CON, но я полагаю, что это может быть для кого-то с особыми потребностями.
...