MySQL Cannot Add Foreign Key Constraint エラーを修正する方法は?
公開: 2022-12-22「 MySQL は外部キー制約を追加できません」というエラーをどのように修正しますか? 外部キー制約を MySQL テーブルに追加しようとすると、「エラー 1215 (HY000): 外部キー制約を追加できません」というエラー メッセージが表示される場合があります。
このようなエラーは非常に一般的なものであり、MySQL が外部キー制約をテーブルに挿入できない特定の理由に関する特定の詳細を提供しません。 この問題を解決するには、問題の正確な原因を特定する必要があります。
この記事では、MySQL の「#1215 – Cannot Add Foreign Key Constraint」エラーの原因とその原因の特定方法、および有効な 4 つの方法で修正する方法について説明します。
MySQL「#1215 – 外部キー制約を追加できません」エラーの理由は何ですか?
このエラーには、さまざまな原因が考えられます。 このエラーの原因を特定するには、SHOW ENGINE INNODB STATUS の LATEST FOREIGN KEY ERROR セクションを調べることをお勧めします。
このようにして、問題をよりよく理解することができます。 次のリストからケースを特定できます。
通常、ダンプをロードするとき、制約が参照するテーブルまたはインデックスは存在しません
場合によっては、顧客が制約を追加したいデータベース テーブルが存在せず、1215 エラー メッセージが表示されることがあります。
ただし、テーブルが存在しないという兆候はないため、このコマンドを使用して、データベースで使用可能なテーブルを確認することをお勧めします。
各親テーブルで SHOW TABLES または SHOW CREATE TABLE を実行します。 エラー 1146 を返すテーブルは、テーブルが間違った順序で作成されたことを示します。
解決策は、欠落している CREATE TABLE を実行して再試行するか、外部キー チェックを一時的に無効にすることです。 循環参照が存在する可能性があるバックアップの復元中に、この手順を実行することが不可欠です。
次のコードを実行して、エラーを修正します。
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS; SET FOREIGN_KEY_CHECKS=0; SOURCE /backups/mydump.sql; -- restore your backup within THIS session SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
制約参照のテーブルまたはインデックスの誤用引用符
このエラーを診断する場合は、各 FOREIGN KEY 宣言を調べて、オブジェクト修飾子を引用符で囲んでいないこと、またはテーブルを引用符で囲み、各列名を 1 対で囲んでいることを確認してください。
これは、何も引用しないか、テーブルと列を別々に引用することで解決できます。
制約参照のローカル キー、外部テーブル、または列にタイプミスがあります
SHOW TABLES および SHOW COLUMNS を実行し、文字列を REFERENCES 宣言で指定されたものと比較することで、このエラーを診断できます。 タイプミスは発見次第直すべきです。
制約が参照する列は、外部列と同じタイプまたは幅ではありません
診断のために、SHOW CREATE TABLE 親を使用して、ローカル列と参照列に同じタイプのデータと幅が含まれていることを確認します。
この問題は、DDL ステートメントを編集して、子テーブルの列定義が親テーブルの列定義と一致するようにすることで解決できます。
外部オブジェクトはいかなる種類の KEY でもありません
この問題を診断するには、SHOW CREATE TABLE の親を使用してテーブルの REFERENCES 部分を調べ、それを指している列がインデックス化されていないことを確認します。
列を KEY、UNIQUE KEY、または PRIMARY KEY のいずれかに設定して、問題を修正してください。
外部キーが複数列の PK または UK であり、参照される列が一番左の列ではない
このエラーを診断するには、SHOW CREATE TABLE 親コマンドを実行して、REFERENCES 部分が、いくつかの複数列インデックスに存在する列を指しているかどうかを判断しますが、その列はその定義の左端ではありません。
参照される列が左端または唯一の列である親テーブルにインデックスを追加することで、問題を解決できます。
2 つのテーブル/列間で異なる文字セット/照合
問題を診断するには、SHOW CREATE TABLE parent を実行し、子列の CHARACTER SET および COLLATE 部分が親テーブルのものと一致することを確認します。
これを修正するには、子テーブルの DDL がその親テーブル/列の文字セットおよび照合順序と一致していることを確認するか、親テーブルを ALTER して、その定義が子の定義と一致するようにします。
親テーブルは InnoDB を使用していません
この問題は、SHOW CREATE TABLE parent を実行し、ENGINE=INNODB をチェックすることで診断できます。
この問題を解決するには、親テーブルを ALTER して MySQL から InnoDB に切り替えます。
「外部キー制約を追加できません」エラーの理由を見つける方法は?
このエラーは、MySQL がテーブルに外部キー制約を実装できない特定の理由を示すものではなく、非常に一般的なものです。
この問題を解決するには、正確な原因を特定する必要があります。 これを行うには、MySQL クライアントで次のクエリを実行します。
SHOW ENGINE INNODB STATUS;
このクエリから、Type、Name、および Status の 3 つのフィールドが返されます。 LATEST FOREIGN KEY ERROR は、結果のステータス列を展開することで識別できます。
このセクションの目的は、最後の変更クエリが失敗した理由を特定して、問題を解決できるようにすることです。
通常、この問題の原因として、プライマリ テーブルと外部テーブルの列の型が一致していません。
この問題は、MyISAM と InnoDB など、2 つのテーブルのエンジン タイプ間の不一致によっても発生する可能性があります。
また、UTF-8 を使用するテーブルと latin1 を使用するテーブル間の異なる照合順序が原因で発生する可能性もあります。
次の要因に注意する必要があります。
Engine : 各テーブルは、InnoDB などの同じデータベース エンジンで構成する必要があります。
データ型: 1 つのテーブルで、両方の列が同じ「 datatype. int(11)
datatype. int(11)
"、一方、別の例では、 smallint(5)
が問題を引き起こします。
照合: 互換性を確保するために、両方の列の文字セットは同じである必要があります (UTF8 など)。
注意: テーブルの照合順序が同じであっても、列には異なる列が含まれる可能性があります。
Unique : 外部キーは参照テーブル内の一意のフィールド (通常はプライマリ フィールド) を参照する必要があります。
Ungisned : あるテーブルには署名されていないキーがあり、別のテーブルには署名されていないキーがない可能性があります。
MySQL「#1215 – 外部キー制約を追加できません」エラーを修正する方法 (4 つの方法)?
このエラー メッセージのさまざまな原因について説明したので、次の手順に進みました。 このエラーは修正する必要があるため、4 つの効果的な方法でそれを行う方法を見てみましょう。
方法 1: テーブルの可用性を確認する
エラーのトラブルシューティングを開始するには、次のコマンドを実行して、テーブルが存在するかどうかを確認できます。
show tables;
このコードから、テーブルが使用可能であったため、制約を作成できたことは明らかです。
方法 2: 親テーブルが InnoDB を使用していることを確認する
データベース テーブルに設定されているストレージ エンジンを確認することで、さらに調査を行うことができます。 これを行うには、次のコマンドを使用できます。
SHOW CREATE TABLE parent
その結果、InnoDB がストレージ エンジンではないことがわかります。 ENGINE=MYISAM が設定されているため、次のコマンドを実行してストレージ エンジンを変更できます。
ALTER TABLE parent ENGINE=INNODB;
最終的にこの方法でエラーを修正することができます。
方法 3: 不適切な引用がないか確認する
すべての FOREIGN KEY 宣言について、オブジェクト修飾子を引用符で囲んでいないこと、またはテーブル名と列名を別々の引用符で囲んでいないことを確認してください。
この方法では、何も引用しないか、列とテーブルを別々に引用してエラーを修正する必要があります。
方法 4: キーが存在するかどうかを確認する
MySQL コマンドを入力するときは、正しいコマンドが入力されていることを確認する必要があります。 クロスチェックにより、顧客がターゲット テーブル内の存在しないテーブル キーを参照していないことが保証されます。
したがって、テーブル上のキーの使用方法を顧客に修正する必要があります。 場合によっては、ON DELETE SET NULL に使用されている列に NULL 定義がない可能性があります。
MySQL エラー 1215 を防ぐには、列がデフォルトの null 値に設定されていることを確認する必要があります。
結論
この記事では、MySQL の「#1215 – Cannot Add Foreign Key Constraint」エラーの原因、原因の特定方法、および有効な 4 つの方法で修正する方法について説明しました。
この記事をご覧いただきありがとうございます。 あなたにそれを提示することは私たちの喜びです。 コメント欄に、質問やコメントを投稿してください。
最新のニュースを入手したい場合は、Facebook と Twitter のページに「いいね」を押してフォローしてください。