最近、システムを新しいサーバーに移行し、すべてに InnoDB テーブルを使用しましたが、外部キー制約の問題に直面しました。ほとんどは修正しましたが、1つに固執しています。システム (Java webapp) は常に独自に外部キーを処理してきたため、これは少し新しいことですが、機能する限りは問題ありません。
macro_client、client、client_location、および client_contact の 4 つの階層テーブルがあるため、macro_client には多数のクライアントなどを含めることができます。client_contact には、前の 3 の外部キーがあります。また、ケース テーブルがあり、それらは m:n テーブルで接続されています。
システムが実行するタスクの 1 つは、新しいレコードの一部を既存のレコードに移動することです。たとえば、新しい client_contact と client_location を既存の client と macro_client の下に移動します。これは、送信を処理していて、誰かがクライアントがシステムに既に存在することを発見したときに行われます - システムはこれを簡単にします。したがって、システムはそれを行うために ID を変更します (その後、ダングリング クライアントを削除し、macro_client は不要になりました)。ここでエラーが発生します。
これが私が受け取るエラーです。これらの更新ステートメントを MySQL Workbench で一度に 1 つずつ手動で実行しましたが、同じメッセージが表示されます。試した順序に関係なく、最初の更新で発生します。
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`prod1_cases_clients`.`client_contact_cases`, CONSTRAINT `fk_{345FCA29-D80B-48E0-A25E-06432436F9A6}` FOREIGN KEY (`client_contact_id`, `client_loc_id`, `client_id`, `macro_client_id`) REFERENC)
アップデートは
UPDATE client_contact SET macro_client_id = 61, client_id = 55 WHERE macro_client_id = 13368;
UPDATE client_location SET macro_client_id = 61, client_id = 55 WHERE macro_client_id = 13368;
UPDATE client_contact_cases SET macro_client_id = 61, client_id = 55 WHERE case_id = 1286148;
私はこれについて間違っていますか?外部キーの動作を変更する必要がありますか? webapp が外部キーの更新を処理し、移植性を維持することをお勧めします。私が推測する外部キーの考え方の中でそれを機能させる必要があるだけです。それ以外の場合は、毎回外部キーのチェックをオフおよびオンにする必要があります。それとも、それが私の唯一の選択ですか?
更新されたイメージと追加された SHOW CREATE TABLE 明らかな円を見ることができますが、全体が 1 対多ではありません。client_contact と package の間のリンクを削除できます - 実際には使用されていません。
CREATE TABLE `macro_client` (...,
PRIMARY KEY (`macro_client_id`)
)
CREATE TABLE `client` (...,
PRIMARY KEY (`client_id`,`macro_client_id`),
KEY `client_FKIndex1` (`macro_client_id`),
KEY `index_client_referrer_form_url_name` (`referrer_form_url_name`),
CONSTRAINT `fk_{3CBF0AA2-914E-49DF-930D-8DA10CA5DDA7}` FOREIGN KEY (`macro_client_id`) REFERENCES `macro_client` (`macro_client_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
)
CREATE TABLE `client_location` (...,
PRIMARY KEY (`client_loc_id`,`client_id`,`macro_client_id`),
KEY `client_location_FKIndex1` (`client_id`,`macro_client_id`),
CONSTRAINT `fk_{98D38761-65BA-4FC1-9BC9-2B6B95B23394}` FOREIGN KEY (`client_id`, `macro_client_id`) REFERENCES `client` (`client_id`, `macro_client_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
)
CREATE TABLE `client_contact` (...,
PRIMARY KEY (`client_contact_id`,`client_loc_id`,`client_id`,`macro_client_id`),
UNIQUE KEY `weblogin_user_UNIQUE` (`weblogin_user`),
KEY `client_contact_FKIndex1` (`client_loc_id`,`client_id`,`macro_client_id`),
CONSTRAINT `fk_{B0C4B667-CDD6-4DEF-BC06-31C7C9BB29C2}` FOREIGN KEY (`client_loc_id`, `client_id`, `macro_client_id`) REFERENCES `client_location` (`client_loc_id`, `client_id`, `macro_client_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
)
CREATE TABLE `client_contact_cases` (...,
PRIMARY KEY (`macro_client_id`,`client_id`,`client_loc_id`,`client_contact_id`,`case_id`),
KEY `client_contact_has_cases_FKIndex1` (`client_contact_id`,`client_loc_id`,`client_id`,`macro_client_id`),
KEY `client_contact_has_cases_FKIndex2` (`case_id`),
CONSTRAINT `fk_{345FCA29-D80B-48E0-A25E-06432436F9A6}` FOREIGN KEY (`client_contact_id`, `client_loc_id`, `client_id`, `macro_client_id`) REFERENCES `client_contact` (`client_contact_id`, `client_loc_id`, `client_id`, `macro_client_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_{1C2AE8A5-3D40-4827-99CD-AC1D3A2EE4C9}` FOREIGN KEY (`case_id`) REFERENCES `cases` (`case_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
)
CREATE TABLE `cases` (...,
PRIMARY KEY (`case_id`),
KEY `index_cases_case_mgr` (`case_mgr`),
KEY `index_cases_status_code` (`status_code`)
)
CREATE TABLE `package` (...,
PRIMARY KEY (`package_id`,`macro_client_id`,`client_id`,`client_loc_id`,`client_contact_id`),
KEY `package_FKIndex1` (`client_contact_id`,`client_loc_id`,`client_id`,`macro_client_id`),
KEY `package_loc_id_index` (`loc_id`),
KEY `package_package_logger_index` (`package_logger`),
KEY `package_recd_sent_date_index` (`recd_sent_date`),
CONSTRAINT `fk_{37F3D2D5-0D52-4199-B963-34FEE1AD3F2F}` FOREIGN KEY (`client_contact_id`, `client_loc_id`, `client_id`, `macro_client_id`) REFERENCES `client_contact` (`client_contact_id`, `client_loc_id`, `client_id`, `macro_client_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1343 DEFAULT CHARSET=utf8 PACK_KEYS=0
CREATE TABLE `item` (...,
PRIMARY KEY (`item_id`,`package_id`,`case_id`,`macro_client_id`,`client_id`,`client_loc_id`,`client_contact_id`),
KEY `item_FKIndex1` (`package_id`,`macro_client_id`,`client_id`,`client_loc_id`,`client_contact_id`),
KEY `item_FKIndex2` (`case_id`),
CONSTRAINT `fk_{2FD3D784-5AFC-47A6-A836-5A421A603B6D}` FOREIGN KEY (`package_id`, `macro_client_id`, `client_id`, `client_loc_id`, `client_contact_id`) REFERENCES `package` (`package_id`, `macro_client_id`, `client_id`, `client_loc_id`, `client_contact_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_{30C849E2-6843-4815-8FD5-0F1C21C6976B}` FOREIGN KEY (`case_id`) REFERENCES `cases` (`case_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
)