我们使用Flyway进行数据迁移,并希望使用JUnit测试我们的SQL脚本。
对于大多数脚本运行良好,但似乎某些SQL语句不适用于h2和Oracle
alter table mytable modify (status not null);
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
并尝试与其他数据库兼容
我提交了一个github问题并且知道该问题将在下一个h2 db版本中得到解决:https://github.com/h2database/h2database/issues/689
答案 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
);