1. ホーム
  2. データベース

mysqlの外部キー作成失敗の問題

2022-03-02 19:55:38

djangoフレームワークを使ってmysqlデータベースに接続し、いくつかのmodsを構築し、python manage.py migrateを使用していますが、以下のエラーが発生します。

django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint') です。







まずSHOW ENGINE INNODB STATUSG;を使って、LATEST FOREIGN KEY ERRORのエントリーを探して表示すると、次のように表示されます。

drmk_work/#sql-285c_158a テーブルの外部キー制約でエラーが発生しました。



 FOREIGN KEY (`hospital_id`) REFERENCES `hospital_hospital` (`objectId`) を参照してください。



参照されるテーブルの中で



参照されるカラムが最初のカラムとして表示されるか、カラムの種類が



のテーブルと参照されるテーブルが制約のために一致しません。



でENUMとSETの内部記憶型が変更されたことに注意してください。



InnoDB-4.1.12で作成されたテーブルでは、古いテーブルのカラムはそのようなものではありません。



は、新しいテーブルのそのようなカラムから参照することはできません。



http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html を参照してください。



を使用すると、正しい外部キーの定義が得られます。





mysql が外部キーの作成に失敗する理由は、ネット上でさまざまなものが見つかっています。

例えば、1つがINT(10)であれば、外部キーもINT(11)やTINYINTではなく、INT(10)に設定する必要があります。クエリブラウザによってはINT(10)とINT(11)の両方を整数として表示することがあるので、SHOWコマンドでフィールドのサイズを確認する必要があります。さらに、2つのフィールドの一方がSIGNEDで、もう一方がUNSIGNEDであるかどうかを判断しなければなりませんが、これは厳密に一致させなければなりません。signedとunsignedの詳細については、http://www.verysimple.com/blog/?p=57。

2. 参照しようとする外部キーの一方がインデックスされていない、または主キーでない場合、そのキーにインデックスを作成する必要があります。 

3. 外部キーの名前が既に存在するキーである。この場合、データベースをチェックして外部キー名がユニークであることを確認するか、キー名にいくつかのランダムな文字を追加して、これが原因であるかどうかをテストする必要があります。 

4. どちらか一方または両方がMyISAMエンジンのテーブルで、外部キー制約を使用する場合はInnoDBエンジンでなければなりません。(実際、両方のテーブルが MyISAM エンジンの場合、このエラーは全く発生しませんが、外部キーも生成されません)。ブラウザで問い合わせることで、テーブルのエンジンタイプを設定することができます。

5. ON DELETE SET NULL を設定したが、関連するキーのフィールドが NOTS NULL 値に設定されている可能性があります。カスケードプロパティの値を変更するか、フィールドプロパティをNULLを許可するように設定することで、このバグを修正できる場合があります。 

6. 6. CharsetとCollateのオプションがテーブルとフィールドレベルで一貫していることを確認してください。

7. 外部キーにdefault=0のようなデフォルト値を設定している可能性があります。

8. このリレーションシップの内部では、フィールドの1つが、独自の個別のインデックスを持たないキー値の組み合わせの1つであり、この場合、そのための個別のインデックスを作成する必要があります。 

9. ALTER ステートメントに構文エラーがあります。





tip #6 によると、Charset が異なる 2 つのテーブルが見つかり、1 つは utf8 で、もう 1 つは latin-1 でした。