5

既存のデータベースのバージョン管理に 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 を生成するため。

これは機能しますが、問題は、生成された変更セットを実行しようとしたときです。私は得る

子行を追加または更新できません: 外部キー ...' 変更セットのエクスポートされた順序が外部キーを考慮していないためです。

私の質問は次のとおりです。正しい順序で変更セットを生成できるコマンドオプションまたは何かがありますか、それとも変更セットを手動で並べ替えて目的の結果を得る必要がありますか?

アップデート:

通常、外部キーは外部キーの後に作成する必要があります。しかし、私たちのシステムでは、コア アプリケーションがデータベースの構造を作成し、複数のクライアント アプリケーションが同じデータベース内の独自のプライベート データをデータベースに入力しています。また、データを生成しているとき、データ変更セットはデータベース内のテーブルのアルファベット順に生成されます。これは、外部キー制約の可能性があります。変更セットを手動で配置することはできましたが、この特定の状況に対するより適切な回避策があるかどうかを知りたいです。

4

2 に答える 2

8

問題は、変更の種類の順序 (テーブル、データ、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>

それらの後。

于 2014-05-21T15:22:08.897 に答える