Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何替换H2数据库中的枚举类型?_Java_Mysql_H2 - Fatal编程技术网

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

Java 如何替换H2数据库中的枚举类型?,java,mysql,h2,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类型?没有;尽管如此,enum在任何情况下都不是一个很好的解决方案,只需使用一个参考表即可。我不确定这是否是您想要的,但您可以使用一

MySQL方言:

CREATE TABLE My_Table ( my_column enum ('first', 'second', ... 'last'));
H2方言:

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

什么类型在H2中也是等效的?MySQL的
enum
类型?

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

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

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、ApacheDerby、PostgreSQL、HSQLDB甚至SQLite中工作。我没有测试其他数据库。

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

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_表
时,它将执行外键检查,以确保插入的值位于
My_Enum_表

不过,这里有一些权衡:

  • 专业人士
    • 您仍然可以使用与枚举
相同的方式进行交互
  • 您还可以获得一点额外的灵活性,即可以添加另一个值,而无需更改表定义
  • 缺点
    • 这可能比枚举慢,因为它必须进行表查找。但实际上,由于该表的行数应该相当少,因此这可能是可以忽略不计的。将索引添加到My_表中。My_列可能会有所帮助
    • 这就避免了与引用表连接的需要,但从数据库的角度来看,其复杂性基本相同。尽管这可能不是什么大问题,除非您担心数据库被另一个表弄乱
    • 这还要求您使用支持外键的引擎,例如
      INNODB
      。我不确定这是否真的是一个骗局,但我想这可能是为了有特殊需要的人
  • 看起来H2有枚举:

    因此,完全相同的语法应该可以工作。(我不知道语义匹配的程度。)

    升级h2 jar

    H2 maven存储库:

    jar版本:

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


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

    顺便说一句,枚举和引用表可能更有效。问题是,无法使用此解决方案枚举可能的值(尽管他可能不需要)。你是说你不知道可能的值?那你怎么能用enum呢?您的示例正确吗?我的意思是,您无法以任何方式获得接受值的列表,除非查看约束。它现在有支持,但在编写问题时没有支持。也许你想在你的答案中澄清一下。没有推理或参考的情况下,减1表示“enum在任何情况下都不是一个很好的解决方案”。