我正在使用 Liquibase 对现有数据库进行版本控制,所以我使用
liquibase \
--logLevel=debug \
--driver=com.mysql.jdbc.Driver \
--classpath=lib/mysql-connector-java-5.1.30.jar \
--url="jdbc:mysql://127.0.0.1:3306/schema" \
--username=user \
--password=pass \
--diffTypes="data" \
--changeLogFile="./data.xml" generateChangeLog
用于生成变更集 xml。
这是可行的,但问题是当我尝试运行这些生成的变更集时。我明白了
无法添加或更新子行:外键...',因为变更集的导出顺序不考虑外键。
我的问题是:是否有命令选项或可以按正确顺序生成变更集的选项,或者我应该手动重新排序变更集以获得所需的结果?
Update:
通常,外键应该在外键之后创建。但是,在我们的系统中,核心应用程序创建数据库的结构,并且多个客户端应用程序使用同一数据库中自己的私有数据填充数据库。当我们生成数据时,数据变更集是按照数据库中表的字母顺序生成的,这可能是外键约束。我们设法手动安排变更集,但我想知道对于这种特殊情况是否有更好的解决方法。
因此,问题不在于更改类型的顺序(表,然后是数据,然后是 FK),而在于您仅使用生成的数据插入与现有表和 FK 结构? Liquibase 甚至没有尝试弄清楚行如何相互依赖,因为在一般情况下这几乎是不可能的。
最简单的解决方案是在插入之前禁用 FK 检查,然后重新启用它们。如何执行此操作取决于您的数据库,但您可以包含以下内容:
<changeSet id="disable-keys" author="x" runAlways="true">
<sql>SET FOREIGN_KEY_CHECKS=0;</sql>
</changeSet>
在你之前<insert>
标签和
<changeSet id="enable-keys" author="x" runAlways="true">
<sql>SET FOREIGN_KEY_CHECKS=1;</sql>
</changeSet>
在他们之后。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)