Liquibase 验证异常:mysql 中不允许使用 forIndexName
Liquibase Validation Exception: forIndexName is not allowed in mysql
我已经从现有的 Oracle 数据库生成了变更集。当我尝试在 MYSQL 数据库中执行该变更集以复制模式时,出现以下异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.ValidationFailedException: Validation Failed:
1 changes have validation failures
forIndexName is not allowed on mysql, db/changelog/2019/001-initial_schema.xml::157562123123-12::sahilmehta97 (generated)
失败的变更集是
<changeSet author="sahilmehta97 (generated)" id="157562123123-11">
<createIndex indexName="STUDENTID_UNIQUE" tableName="STUDENT" unique="true">
<column name="STUDENT_ID"/>
</createIndex>
</changeSet>
<changeSet author="sahilmehta97 (generated)" id="157562123123-12">
<addUniqueConstraint columnNames="STUDENT_ID" constraintName="STUDENTID_UNIQUE" forIndexName="STUDENTID_UNIQUE" tableName="STUDENT"/>
</changeSet>
我知道 MYSQL 不支持 forIndexName,但它是使用 mvn liquibase:generateChangeLog 命令自动生成的。
那么我应该怎么做才能克服这个问题呢?
- 有什么方法可以从 oracle 数据库生成 MYSQL 兼容的变更集?
- 我应该更改从 oracle 数据库生成的变更集吗?
- 当我 运行 mvn liquibase:update 命令更新 MYSQL 数据库时,有什么方法可以使生成的 chageset 与 MYSQL 兼容?
或者有其他方法吗?
不保证从数据库生成的变更日志可以在不同的数据库平台上运行。虽然 Liquibase XML 变更日志格式被设计为与数据库无关,但仍有一些功能是特定于数据库的。
如果您的目标是创建适用于多个数据库平台的变更日志,则必须特别小心(和测试)以确保变更日志适用于这些平台。描述所有必须完成的不同事情将非常困难。
在这种情况下,我将更改变更集以仅从变更集中删除 forIndexName
属性。然后通过使用 liquibase update
命令将变更集部署到 Oracle 和 MySQL 数据库来测试它,以确保它正在执行您想要的操作。
我已经从现有的 Oracle 数据库生成了变更集。当我尝试在 MYSQL 数据库中执行该变更集以复制模式时,出现以下异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.ValidationFailedException: Validation Failed:
1 changes have validation failures
forIndexName is not allowed on mysql, db/changelog/2019/001-initial_schema.xml::157562123123-12::sahilmehta97 (generated)
失败的变更集是
<changeSet author="sahilmehta97 (generated)" id="157562123123-11">
<createIndex indexName="STUDENTID_UNIQUE" tableName="STUDENT" unique="true">
<column name="STUDENT_ID"/>
</createIndex>
</changeSet>
<changeSet author="sahilmehta97 (generated)" id="157562123123-12">
<addUniqueConstraint columnNames="STUDENT_ID" constraintName="STUDENTID_UNIQUE" forIndexName="STUDENTID_UNIQUE" tableName="STUDENT"/>
</changeSet>
我知道 MYSQL 不支持 forIndexName,但它是使用 mvn liquibase:generateChangeLog 命令自动生成的。 那么我应该怎么做才能克服这个问题呢?
- 有什么方法可以从 oracle 数据库生成 MYSQL 兼容的变更集?
- 我应该更改从 oracle 数据库生成的变更集吗?
- 当我 运行 mvn liquibase:update 命令更新 MYSQL 数据库时,有什么方法可以使生成的 chageset 与 MYSQL 兼容?
或者有其他方法吗?
不保证从数据库生成的变更日志可以在不同的数据库平台上运行。虽然 Liquibase XML 变更日志格式被设计为与数据库无关,但仍有一些功能是特定于数据库的。
如果您的目标是创建适用于多个数据库平台的变更日志,则必须特别小心(和测试)以确保变更日志适用于这些平台。描述所有必须完成的不同事情将非常困难。
在这种情况下,我将更改变更集以仅从变更集中删除 forIndexName
属性。然后通过使用 liquibase update
命令将变更集部署到 Oracle 和 MySQL 数据库来测试它,以确保它正在执行您想要的操作。