【发布时间】: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 类型?
【问题讨论】:
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 在任何情况下都不是一个很好的解决方案,只需使用参考表即可。
【讨论】:
enum 类型可能出于多种原因需要。几个例子:1)将测试H2数据库结构与现有的生产数据库匹配,该数据库无法更改并且需要这种类型; 2)当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、Apache Derby、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_Table 执行INSERT 时,它将执行外键检查以确保您插入的值在My_Enum_Table 中。
这里有一些取舍:
ENUM 一样与之交互。ENUM 慢,因为它必须进行表查找。但实际上,由于表应该有相当少的行数,这可能是可以忽略不计的。将索引添加到 My_Table.my_column 可能会有所帮助。INNODB。我不确定这是否真的是一个骗局,但我想这可能是针对有特殊需求的人。【讨论】:
看起来 H2 有枚举:http://www.h2database.com/html/datatypes.html#enum_type
所以完全相同的语法应该可以工作。 (我不知道语义匹配有多接近。)
【讨论】:
升级h2 jar
H2 Maven 仓库: https://mvnrepository.com/artifact/com.h2database/h2
jar 版本:
1.4.196 Central(2017 年 6 月)- 枚举支持(已测试)
1.4.192 Central(2016 年 5 月)- 缺乏枚举支持(也经过测试)
【讨论】: