4

スキーマが同じでデータが異なる 2 つのデータベースをマージするツールを開発しています。

その一部は、すべての外部キーを に変更しON UPDATE CASCADE、すべての主キーをインクリメントして、競合を回避し、外部キー ポインターを機能させ続けることです。

私の問題は、FKが壊れている孤立した行がいくつかある場合があるため、次のクエリです。

UPDATE table set pk = pk + 1000000

次のように失敗します: ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails... (外部キー列に触れることさえ考えていませんが!)

私はそれをオフにしたかった:

Set foreign_key_checks=0

しかし、関連する外部キーは更新されません。簡単なテストを行ったところ、foreign_key_checks=0 を設定した後にカスケードが機能しません。

カスケードをトリガーする方法、または設定せずに FK が壊れている行の更新を実行する方法はありますforeign_key_checks=0か? UPDATE IGNOREこの問題は解決しません:(

4

1 に答える 1

1

最初に参照整合性を修正する必要があります。

  1. リレーションが合成タイプの場合、孤立した行を削除します
  2. それ以外の場合は fk フィールドを null に更新します

その後、操作は問題なく機能します。

追加情報:

列が の場合NOT NULL、関係が 1* であることを意味します。この場合、親テーブルに仮想行 (「VIRTUAL PARENT」行など) を追加し、存在しない親を指すすべての fk をこの親に更新する必要があります。これにより、後でデータを処理し、さらに簡単に取得できます。

1* が必要ないと思われる場合 (0* は、テクニカル/アプリケーション層には十分です)、列を nullable として設定してください。

于 2012-09-14T18:40:39.350 に答える