MySQL方言:
CREATE TABLE My_Table ( my_column enum ('first', 'second', ... 'last'));
H2方言:
CREATE TABLE My_Table ( my_column ? ('first', 'second', ... 'last'));
什么类型在H2中与MySQL的enum
类型相同?
答案 0 :(得分:9)
我不确定这是否是您要找的,但您可以做的是使用检查约束:
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。我没有测试其他数据库。
答案 1 :(得分:8)
没有;仍然,enum
在任何情况下都不是一个好的解决方案,只需使用参考表。
答案 2 :(得分:4)
看起来H2有枚举:http://www.h2database.com/html/datatypes.html#enum_type
因此完全相同的语法应该有效。 (我不知道语义匹配有多紧密。)
答案 3 :(得分:3)
升级h2 jar
H2 maven存储库: https://mvnrepository.com/artifact/com.h2database/h2
jar版本:
1.4.196 Central(2017年6月) - 枚举支持(已测试)
1.4.192 Central(2016年5月) - 缺乏枚举支持(也经过测试)
答案 4 :(得分:2)
我遇到了这个问题并通过创建一个单独的表和外键约束来解决它。
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)
);
这样,当您尝试INSERT
进入My_Table
时,它会执行外键检查以确保您插入的值位于My_Enum_Table
。
虽然有一些权衡:
ENUM
相同的方式进行互动。ENUM
慢,因为它必须进行查表。实际上,虽然表格应该有相当少的行数,但这可能相当微不足道。向My_Table.my_column
添加索引可能对此有所帮助。INNODB
。我不确定这是否真的是CON,但我认为它可能适合有特殊需求的人。