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

fnatzsnv  于 11个月前  发布在  Mysql
关注(0)|答案(6)|浏览(87)

MySQL方言:

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

字符串
H2方言:

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


H2中的什么类型与MySQL中的enum类型等价?

wbrvyc0a

wbrvyc0a1#

我不确定这是不是你要找的,但是你可以做的是使用一个检查约束:

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中工作。

camsedfj

camsedfj2#

没有;尽管如此,enum在任何情况下都不是一个很好的解决方案,只是使用一个引用表。

35g0bw71

35g0bw713#

看起来H2有枚举:http://www.h2database.com/html/datatypes.html#enum_type
因此,应该使用完全相同的语法(我不知道语义匹配的程度如何)。

flvlnr44

flvlnr444#

升级h2罐
H2 maven存储库:https://mvnrepository.com/artifact/com.h2database/h2
jar版本:
1.4.196 Central(2017年6月)- enum支持(已测试)
1.4.192 Central(2016年5月)-缺乏枚举支持(也进行了测试)

ruarlubt

ruarlubt5#

我遇到了这个问题,并通过创建一个单独的表和外键约束来解决它。

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添加索引可能会有所帮助。
  • 这就避免了与引用表进行连接的需要,但从数据库的Angular 来看,这基本上是相同的复杂程度。尽管这可能不是什么大问题,除非你担心数据库会被另一个表弄乱。
  • 这也需要你使用一个支持外键的引擎,比如INNODB。我不确定这是否真的是一个骗局,但我想它可能是为有特殊需求的人准备的。
1wnzp6jl

1wnzp6jl6#

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

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

ALTER TABLE example ALTER COLUMN "state" ENUM (
    'CREATED',
    'USED',
    'DELETED'
);

字符串

相关问题