java - H2数据库和oracle模式-alter table only with different sql statement - Flyway迁移测试

标签 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 样式,我会遇到以下异常:SQL 语句“ALTER TABLE MYTABLE MODIFY ([*]STATUS NOT NULL)”中的语法错误;预期的“标识符”;语句: alter table mytable 修改(状态不为空)[42001-196]

我尝试了什么

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

问题

  • 有什么方法可以让 Oracle 语句在 h2 数据库上运行吗?
  • 或者这个SQL alter语句是否属于h2网站提到的这个案例?

    and tries to be compatible with other databases

更新

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

最佳答案

因为您只修改表的一列,所以您可以像这样编写 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
   );

关于java - H2数据库和oracle模式-alter table only with different sql statement - Flyway迁移测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47796297/

相关文章:

linux - 更改本地操作系统时间会影响数据库吗?

sql - 如何根据列值创建重复行

java - 反编译JAVA DLL

java - 员工薪资计算

sql - 如何在不使用500,000+行表中的截断表的同时有效地删除行

SQL:使用连接过滤数据不好吗?

sql - 根据满足多少 WHERE 条件对查询结果进行排名

sql - 为什么 PLSQL 优化级别没有提供预期结果?

java - 使用循环检查现有文件

java - 从文件夹加载类而不指定包