MySQL方言:
CREATE TABLE My_Table ( my_column enum ('first', 'second', ... 'last'));
H2方言:
CREATE TABLE My_Table ( my_column ? ('first', 'second', ... 'last'));
H2中与MySQL的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。我没有测试其它数据库。
目前没有最好的解决方案,不过无论如何,enum
都不是一个好的选择,最好使用一个参考表。
enum
类型可以因许多原因而被要求使用。以下是其中的两个例子: 1) 将测试 H2 数据库结构与现有的生产数据库匹配,该数据库不能更改并且需要此类型; 2) 当 enum
字段是强类型的,并且其选项不容易更改时,可以消除连接表和处理引用表中的插入/更新的负担。 - Uyric看起来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 中央仓库 (2017年6月) - 支持枚举类型 (已测试)
1.4.192 中央仓库 (2016年5月) - 不支持枚举类型 (也已测试)
我遇到了这个问题,通过创建一个单独的表和外键约束来解决它。
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
插入数据时,它将进行外键检查以确保你要插入的值在My_Enum_Table
中。ENUM
一样与之交互。
- 你还可以在不必更改表定义的情况下添加另一个值。ENUM
慢,因为它需要进行表查找。但实际上,由于该表应该只有相对较少的行,所以这可能是相当可忽略的。向My_Table.my_column
添加索引可能有所帮助。
- 这样可以避免与参考表连接,但从数据库的角度来看,基本上具有相同的复杂性。虽然这可能不是什么大问题,除非你担心用另一个表混淆你的数据库。
- 这还要求你使用支持外键的引擎,例如INNODB
。我不确定这是否真的是一个CONS,但我想对于有特殊需求的人来说可能是这样。CREATE TABLE example (
"example" TEXT,
"state" ENUM (
'CREATED',
'DELETED'
)
);
ALTER TABLE example ALTER COLUMN "state" ENUM (
'CREATED',
'USED',
'DELETED'
);