Java 如何替换H2数据库中的枚举类型?
MySQL方言: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在任何情况下都不是一个很好的解决方案,只需使用一个参考表即可。我不确定这是否是您想要的,但您可以使用一
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
1.4.192 Central(2016年5月)-缺乏枚举支持(也经过测试)顺便说一句,枚举和引用表可能更有效。问题是,无法使用此解决方案枚举可能的值(尽管他可能不需要)。你是说你不知道可能的值?那你怎么能用enum呢?您的示例正确吗?我的意思是,您无法以任何方式获得接受值的列表,除非查看约束。它现在有支持,但在编写问题时没有支持。也许你想在你的答案中澄清一下。没有推理或参考的情况下,减1表示“enum在任何情况下都不是一个很好的解决方案”。