1

異なる Firebird データベースの 2 つのテーブルのデータを同期する必要があります。正確には、テーブル Users (2 番目の DB) のレコードを使用して、テーブル Person (1 番目の DB) のレコードを更新する必要があります。「名前」「メールアドレス」「誕生日」だけでなく、IDも(!)問題は、FOREIGN KEY Constraint を介して Person の ID に依存するテーブルがあることです。

私はこれをやろうとしています:

  1. 従属テーブルの外部キー制約を削除します。
  2. 2 つのテーブルを同期します (テーブル Person の ID を更新/変更することを意味します)。
  3. 従属テーブルの適切な ID を変更します。
  4. 従属テーブルに外部キー制約を追加します。

最後の手順でエラーが発生します (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 ステートメント (例):

  1. ALTER TABLE employee DROP CONSTRAINT fk_employee_person
    
  2. UPDATE person SET id = 555555 WHERE id = 3000005
    
  3. UPDATE employee SET person_id = 555555 WHERE person_id = 3000005
    
  4. 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) まではデータベース全体の排他ロックが必要であることもわかりました。

4

2 に答える 2

3

外部キーにON UPDATE CASCADE句があるようにテーブルを作成する必要があります。その後、更新するIDと、依存テーブルでも更新され、追加の手間はかかりません。したがって、テーブルを参照するテーブルごとに、Person次のことを行う必要があります。

-- delete the original FK constraint
ALTER TABLE _table_ DROP CONSTRAINT _fk_constraint_name_;
-- (re)add the FK constraint with ON UPDATE CASCADE
ALTER TABLE _table_ ADD CONSTRAINT _fk_constraint_name_ FOREIGN KEY (person_id) REFERENCES person(id) ON UPDATE CASCADE;
于 2012-11-29T16:27:26.707 に答える
1

主キーの番号を付け直す代わりに、正しい主キーを持つ新しいレコードを に挿入してから、古いレコードpersonの外部キー値を更新して削除します。employeeperson

注: 以下の部分は主観的なものであり、事実というよりは意見です。

ところで: 主キーの番号を付け直す必要があるのは、通常、設計上の問題を示しています。主キーはデータベースの外では無意味である必要があり、通常、特定のレコードの存続期間中は安定している必要があります。あなたの状況では、明らかにキーはデータベース外の何かを意味し、不安定でもあります。

ainの回答に示されているように、使用できますON UPDATE CASCADEが、私見は通常、問題のパッチであり、解決策ではありません。解決策は次のとおりです。主キーが不安定な場合: それらの一意のキーを作成し、変更する必要のない無意味な主キーを追加します。

于 2012-11-30T11:02:29.997 に答える