検索
に質問 MySQL エラー 150: テーブル作成時の外部キー制約のトラブルシューティング

0

他の 2 つのテーブルの主キーを参照する 2 つの外部キーを持つテーブルを MySQL に作成しようとしていますが、errno: 150 エラーが発生し、テーブルは作成されません。作成した。

以下は 3 つのテーブルすべての SQL です:

リーリー


Your Answer
提出する

1 件の回答
0

ALTER TABLE ADD FOREIGN KEY: のときにエラー 150 が発生しないようにするには、これらの条件を満たす必要があります。

  1. 親テーブルを参照する外部キーを定義するには、その前に親テーブルが存在している必要があります。テーブルは正しい順序で定義する必要があります (最初に親テーブル、次に子テーブル)。 2 つのテーブルが相互参照する場合は、FK 制約なしで 1 つのテーブルを作成し、次に 2 番目のテーブルを作成してから、ALTER TABLE を使用して最初のテーブルに FK 制約を追加する必要があります。

  2. どちらのテーブルも外部キー制約、つまり

    ENGINE=InnoDB をサポートする必要があります。他のストレージ エンジンは外部キー定義を黙って無視するため、エラーや警告は返されませんが、FK 制約は保存されません。

  3. 親テーブルで参照される列は、キーの左端の列である必要があります。親のキーが

    PRIMARY KEY または UNIQUE KEY であることが最善です。

  4. FK 定義は、PK 定義と同じ順序で PK 列を参照する必要があります。たとえば、FK

    REFERENCES Parent(a,b,c) の場合、親の PK を (a,c,b) の順序で列に定義してはなりません。

  5. 親テーブルの PK 列は、子テーブルの FK 列と同じデータ型である必要があります。たとえば、親テーブルの PK 列が

    UNSIGNED である場合、子テーブル フィールドの対応する列に必ず UNSIGNED を定義してください。

    例外: 文字列の長さは異なる場合があります。たとえば、

    VARCHAR(10)VARCHAR(20) を参照でき、その逆も可能です。

  6. 文字列型の FK 列は、対応する PK 列と同じ文字セットおよび照合順序を持つ必要があります。

  7. 子テーブルに既にデータがある場合、FK 列の各値は親テーブルの PK 列の値と一致する必要があります。次のようなクエリを使用してこれを確認します:

    リーリー

    これは、一致しない値をゼロ (0) 返す必要があります。明らかに、このクエリは一般的な例であるため、テーブル名と列名を置き換える必要があります。

  8. 親テーブルも子テーブルも

    TEMPORARY テーブルにすることはできません。

  9. 親テーブルも子テーブルも PARTITIONED テーブルにすることはできません。

  10. FK が

    ON DELETE SET NULL オプションを使用して宣言されている場合、FK 列は NULL 可能である必要があります。

  11. 外部キーの制約名を宣言する場合、その制約名は、制約が定義されているテーブル内だけでなく、スキーマ全体で一意である必要があります。 2 つのテーブルに同じ名前の独自の制約を設定することはできません。

  12. 新しい FK を作成しようとしているのと同じフィールドを指す他のテーブルに他の FK があり、それらの形式が不正である (つまり、照合順序が異なる) 場合は、最初にそれらの一貫性を保つ必要があります。これは、

    SET FOREIGN_KEY_CHECKS = 0; が一貫性のない関係として誤って定義された過去の変更が原因である可能性があります。これらの問題のある FK を特定する方法については、以下の @andrewdotn の回答を参照してください。

2023-10-17 12:24:03

提出する

Hot Tools

vc9-vc14 (32+64 ビット) ランタイム ライブラリ コレクション (以下のリンク)

vc9-vc14 (32+64 ビット) ランタイム ライブラリ コレクション (以下のリンク)

phpStudy のインストールに必要なランタイム ライブラリのコレクションをダウンロードします。

VC9 32ビット

VC9 32ビット

VC9 32 ビット phpstudy 統合インストール環境ランタイム ライブラリ

PHP プログラマー ツールボックスのフルバージョン

PHP プログラマー ツールボックスのフルバージョン

プログラマ ツールボックス v1.0 PHP 統合環境

VC11 32ビット

VC11 32ビット

VC11 32ビットphpstudy統合インストール環境ランタイムライブラリ

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい