ホームページ  >  に質問  >  本文

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

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

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

リーリー


P粉254077747P粉254077747390日前723

全員に返信(1)返信します

  • P粉562845941

    P粉5628459412023-10-17 12:24:03

    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) の順序で列に定義してはなりません。 < /p>

    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 の回答を参照してください。

    13. 返事
      0
  • キャンセル返事