如何替换H2数据库中的枚举类型?

问题描述 投票:0回答:6

MySQL 方言:

CREATE TABLE My_Table ( my_column enum ('first', 'second', ... 'last'));

H2方言:

CREATE TABLE My_Table ( my_column ? ('first', 'second', ... 'last'));

H2 中什么类型也相当于 MySQL 中的

enum
类型?

java mysql h2
6个回答
18
投票

我不确定这是否是您正在寻找的,但您可以做的是使用检查约束:

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。我没有测试其他数据库。


5
投票

没有;不过,无论如何,

enum
都不是一个很好的解决方案,只需使用参考表即可。


5
投票

看起来 H2 有枚举:http://www.h2database.com/html/datatypes.html#enum_type

所以完全相同的语法应该有效。 (我不知道语义匹配得有多紧密。)


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 月)- 缺乏枚举支持(也经过测试)


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
      。我不确定这是否真的是一个缺点,但我想它可能适合有特殊需求的人。

0
投票

H2 现在支持这一点,您可以创建一个带有枚举列的表,甚至可以在需要时更改枚举。

CREATE TABLE example (
    "example" TEXT,
    "state" ENUM (
         'CREATED',
         'DELETED'
     )
);

ALTER TABLE example ALTER COLUMN "state" ENUM (
    'CREATED',
    'USED',
    'DELETED'
);
© www.soinside.com 2019 - 2024. All rights reserved.