设置
我们使用 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/