異なる Firebird データベースの 2 つのテーブルのデータを同期する必要があります。正確には、テーブル Users (2 番目の DB) のレコードを使用して、テーブル Person (1 番目の DB) のレコードを更新する必要があります。「名前」「メールアドレス」「誕生日」だけでなく、IDも(!)問題は、FOREIGN KEY Constraint を介して Person の ID に依存するテーブルがあることです。
私はこれをやろうとしています:
- 従属テーブルの外部キー制約を削除します。
- 2 つのテーブルを同期します (テーブル Person の ID を更新/変更することを意味します)。
- 従属テーブルの適切な ID を変更します。
- 従属テーブルに外部キー制約を追加します。
最後の手順でエラーが発生します (Java アプリケーションからのログですが、これらの手順を IBExpert で直接実行しても同じです):
com.bssys.db.jdbc.DBSQLException: GDS Exception. 335544466. violation of FOREIGN KEY constraint "FK_EMPLOYEE_PERSON" on table "EMPLOYEE"
Foreign key reference target does not exist, error code: HY000
Reason: violation of FOREIGN KEY constraint "FK_EMPLOYEE_PERSON" on table "EMPLOYEE"
(従業員 - 従属テーブルの 1 つです)
私の質問は、このエラーを回避できるかどうかです。または、関連するテーブルの ID を変更する方法についていくつかのアイデアがあるかもしれません。データベースを同期するための特別な RDBMS ツールがあるかもしれませんが、Java アプリケーションを介してそれらを同期する必要があるため、SQL と Java のみを使用します。私は Firebird 2.5.1 を使用しています。
完全な SQL ステートメント (例):
ALTER TABLE employee DROP CONSTRAINT fk_employee_person
UPDATE person SET id = 555555 WHERE id = 3000005
UPDATE employee SET person_id = 555555 WHERE person_id = 3000005
ALTER TABLE employee ADD CONSTRAINT fk_employee_person FOREIGN KEY (person_id) REFERENCES person(id)
新しい情報: IBExpert でこれらの手順を実行できる場合があるようです。実際には、テーブルの 1 つが「DATA」モードのときにすべての ID を変更すると、エラーが発生します (これは、のような何らかのトランザクションでもあると思いますCREATE VIEW
)。
外部キーの削除/追加には、少なくとも Firebird 2.1 (または 2.5) まではデータベース全体の排他ロックが必要であることもわかりました。