【问题标题】:How to replace enum type in H2 database?如何替换 H2 数据库中的枚举类型?
【发布时间】:2012-03-10 19:11:06
【问题描述】:

MySQL 方言:

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

H2方言:

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

什么类型在 H2 中也等同于 MySQL 中的 enum 类型?

【问题讨论】:

    标签: java mysql h2


    【解决方案1】:

    没有;尽管如此,enum 在任何情况下都不是一个很好的解决方案,只需使用参考表即可。

    【讨论】:

    • 在没有推理或参考的情况下,“枚举在任何情况下都不是一个很好的解决方案”减去 1。
    • enum 类型可能出于多种原因需要。几个例子:1)将测试H2数据库结构与现有的生产数据库匹配,该数据库无法更改并且需要这种类型; 2)当enum字段是强类型时,消除连接表和处理引用表中的插入/更新的负担,其选项不会提示更改。
    【解决方案2】:

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

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

    【讨论】:

    • 顺便说一句,枚举和引用表可能更有效。
    • 问题是没有办法用这个解决方案枚举可能的值(尽管他可能不需要它)。
    • 你的意思是你不知道可能的值?那你怎么能使用枚举呢?你的例子正确吗?
    • 我的意思是,除了查看约束之外​​,您无法以任何方式获得接受值的列表。
    【解决方案3】:

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

    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)
    );
    

    这样,当您尝试对My_Table 执行INSERT 时,它将执行外键检查以确保您插入的值在My_Enum_Table 中。

    这里有一些取舍:

    • 优点
      • 您仍然可以像使用 ENUM 一样与之交互。
      • 您还可以获得一点额外的灵活性,因为您可以添加其他值而无需更改表定义。
    • 缺点
      • 这可能比ENUM 慢,因为它必须进行表查找。但实际上,由于表应该有相当少的行数,这可能是可以忽略不计的。将索引添加到 My_Table.my_column 可能会有所帮助。
      • 这避免了与参考表联接的需要,但从数据库的角度来看,复杂程度基本相同。尽管这可能没什么大不了的,除非您担心将数据库与另一个表混在一起。
      • 这还需要您使用支持外键的引擎,例如INNODB。我不确定这是否真的是一个骗局,但我想这可能是针对有特殊需求的人。

    【讨论】:

      【解决方案4】:

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

      所以完全相同的语法应该可以工作。 (我不知道语义匹配有多接近。)

      【讨论】:

      【解决方案5】:

      升级h2 jar

      H2 Maven 仓库: https://mvnrepository.com/artifact/com.h2database/h2

      jar 版本:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 2019-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多