H2数据库和oracle模式 - 仅使用不同的sql语句改变表 - 飞路迁移测试

时间:2017-12-13 15:08:25

标签: java sql oracle h2

设置

我们使用Flyway进行数据迁移,并希望使用JUnit测试我们的SQL脚本。

  • 目标(生产)环境在 oracle 上运行,而
  • 开发者计算机运行 h2 数据库(版本:1.4.196)

对于大多数脚本运行良好,但似乎某些SQL语句不适用于h2和Oracle

  • 当前的Oracle:alter table mytable modify (status not null);
  • 正确的h2:alter table mytable ALTER COLUMN status SET NOT NULL

如果我在h2数据库本地运行这个oracle样式,我得到以下异常:Syntax error in SQL statement "ALTER TABLE MYTABLE MODIFY ([*]STATUS NOT NULL) "; expected "identifier"; SQL statement: alter table mytable modify (status not null) [42001-196]

我尝试了什么

根据http://www.h2database.com/html/features.html#compatibility我已经为oracle模式配置了h2数据库:url: jdbc:h2:mem:test;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle

问题

  • 我可以在h2 db上运行Oracle语句吗?
  • 或者这个SQL alter语句是否属于h2网站提到的这种情况?
      

    并尝试与其他数据库兼容

更新

我提交了一个github问题并且知道该问题将在下一个h2 db版本中得到解决:https://github.com/h2database/h2database/issues/689

1 个答案:

答案 0 :(得分:1)

由于您只修改表的一列,因此可以像这样编写ALTER TABLE语句

ALTER TABLE mytable 
MODIFY status VARCHAR2(50) NOT NULL;

此示例假定列status数据类型为VARCHAR2(50)。请确保在ALTER TABLE语句中使用数据类型。您应该使用列status的当前数据类型,除非您也要迁移数据类型。

此外,它不使用(...)这是Oracle特定的快捷方式来更改同一个表的多个列。

alter table
   table_name
modify
   (
       column1_name  column1_datatype,
       column2_name  column2_datatype,
       column3_name  column3_datatype,
       column4_name  column4_datatype
   );