MySQL 外部キー制約エラー: トラブルシューティングと解決策
外部キーを使用するときに MySQL で「エラー 1215 (HY000): 外部キー制約を追加できません」が発生するのは一般的な問題です。 このエラーは通常、外部キー関係を定義する際のテーブルの作成または変更中に発生します。 多くの場合、問題は関連テーブル間の不一致にあります。
エラー メッセージ自体が必ずしも正確な問題を特定するとは限りません。特定の原因を診断するには、次のコマンドを使用します:
<code class="language-sql">SHOW ENGINE INNODB STATUS;</code>
失敗した制約の詳細については、LATEST FOREIGN KEY ERROR
セクションを調べてください。
根本原因と解決策
最も一般的な原因は、外部キー列 (子テーブル内) と参照される主キー列 (親テーブル内) の間のデータ型の不一致です。 たとえば、子テーブルの列が SMALLINT
で、親テーブルの主キーが INT
の場合、制約は失敗します。 データ型は正確に一致する必要があります。
ベスト プラクティスは、テーブルの作成中、特に複雑なリレーションシップを扱う場合は、外部キー チェックを一時的に無効にすることです。 これにより、依存関係の順序付けが回避されます。 その方法は次のとおりです:
<code class="language-sql">SET FOREIGN_KEY_CHECKS = 0; -- Your table creation statements here SET FOREIGN_KEY_CHECKS = 1;</code>
例: データ型の不一致の修正
Patient
テーブルと Appointment
テーブルがエラーの原因だとしましょう。 Patient.MedicalHistory
が SMALLINT
であり、medicalhistory.MedicalHistoryID
が INT
であるとします。 解決策は、型の一貫性を確保することです:
<code class="language-sql">CREATE TABLE IF NOT EXISTS `Patient` ( `PatientID` INT UNSIGNED NOT NULL AUTO_INCREMENT, `FName` VARCHAR(30) NULL, `LName` VARCHAR(45) NULL, `Gender` CHAR NULL, `DOB` DATE NULL, `SSN` DOUBLE NULL, `MedicalHistory` INT UNSIGNED NOT NULL, -- Data type changed to match `PrimaryPhysician` SMALLINT(5) UNSIGNED NOT NULL, PRIMARY KEY (`PatientID`), UNIQUE INDEX `PatientID_UNIQUE` (`PatientID` ASC), CONSTRAINT `FK_MedicalHistory` FOREIGN KEY (`MedicalHistory`) REFERENCES `doctorsoffice`.`medicalhistory` (`MedicalHistoryID`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `FK_PrimaryPhysician` FOREIGN KEY (`PrimaryPhysician`) REFERENCES `doctorsoffice`.`doctor` (`DoctorID`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE = InnoDB;</code>
データ型を慎重に照合し、推奨される外部キー チェックの無効化/有効化手法を使用することで、外部キー制約エラーを効果的に解決し、MySQL データベース内で堅牢な関係を確立できます。
以上がMySQL で「外部キー制約を追加できません」エラーが発生するのはなぜですか? どうすれば修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。