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
都不是一个很好的解决方案,只需使用参考表即可。
看起来 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 月)- 缺乏枚举支持(也经过测试)
我遇到了这个问题,并通过创建单独的表和外键约束来解决它。
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
。我不确定这是否真的是一个缺点,但我想它可能适合有特殊需求的人。H2 现在支持这一点,您可以创建一个带有枚举列的表,甚至可以在需要时更改枚举。
CREATE TABLE example (
"example" TEXT,
"state" ENUM (
'CREATED',
'DELETED'
)
);
ALTER TABLE example ALTER COLUMN "state" ENUM (
'CREATED',
'USED',
'DELETED'
);