如何在H2数据库中替换枚举类型?

时间:2012-02-20 12:36:55

标签: java mysql h2

MySQL方言:

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

H2方言:

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

什么类型在H2中与MySQL的enum类型相同?

5 个答案:

答案 0 :(得分:9)

我不确定这是否是您要找的,但您可以做的是使用检查约束:

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。我没有测试其他数据库。

答案 1 :(得分:8)

没有;仍然,enum在任何情况下都不是一个好的解决方案,只需使用参考表。

答案 2 :(得分:4)

看起来H2有枚举:http://www.h2database.com/html/datatypes.html#enum_type

因此完全相同的语法应该有效。 (我不知道语义匹配有多紧密。)

答案 3 :(得分:3)

升级h2 jar

H2 maven存储库: https://mvnrepository.com/artifact/com.h2database/h2

jar版本:

1.4.196 Central(2017年6月) - 枚举支持(已测试)

1.4.192 Central(2016年5月) - 缺乏枚举支持(也经过测试)

答案 4 :(得分:2)

我遇到了这个问题并通过创建一个单独的表和外键约束来解决它。

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

虽然有一些权衡:

  • 赞成
    • 您仍然可以使用与ENUM相同的方式进行互动。
    • 从某种意义上说,您还可以获得额外的灵活性,而无需更改表定义。
  • CONS
    • 这可能比ENUM慢,因为它必须进行查表。实际上,虽然表格应该有相当少的行数,但这可能相当微不足道。向My_Table.my_column添加索引可能对此有所帮助。
    • 这可以防止需要加入参考表,但从数据库的角度来看基本上具有相同的复杂程度。虽然这可能不是什么大问题,除非你担心用另一个表格混乱你的数据库。
    • 这还要求您使用支持外键的引擎,例如INNODB。我不确定这是否真的是CON,但我认为它可能适合有特殊需求的人。