他の 2 つのテーブルの主キーを参照する 2 つの外部キーを持つテーブルを MySQL に作成しようとしていますが、errno: 150 エラーが発生し、テーブルは作成されません。作成した。
以下は 3 つのテーブルすべての SQL です:
リーリー1 件の回答
ALTER TABLE ADD FOREIGN KEY: のときにエラー 150 が発生しないようにするには、これらの条件を満たす必要があります。
- 親テーブルを参照する外部キーを定義するには、その前に親テーブルが存在している必要があります。テーブルは正しい順序で定義する必要があります (最初に親テーブル、次に子テーブル)。 2 つのテーブルが相互参照する場合は、FK 制約なしで 1 つのテーブルを作成し、次に 2 番目のテーブルを作成してから、ALTER TABLE を使用して最初のテーブルに FK 制約を追加する必要があります。
- どちらのテーブルも外部キー制約、つまり
ENGINE=InnoDB
をサポートする必要があります。他のストレージ エンジンは外部キー定義を黙って無視するため、エラーや警告は返されませんが、FK 制約は保存されません。 - 親テーブルで参照される列は、キーの左端の列である必要があります。親のキーが
PRIMARY KEY
またはUNIQUE KEYであることが最善です。 - FK 定義は、PK 定義と同じ順序で PK 列を参照する必要があります。たとえば、FK
REFERENCES Parent(a,b,c)
の場合、親の PK を(a,c,b)の順序で列に定義してはなりません。 - 親テーブルの PK 列は、子テーブルの FK 列と同じデータ型である必要があります。たとえば、親テーブルの PK 列が
UNSIGNED
例外: 文字列の長さは異なる場合があります。たとえば、である場合、子テーブル フィールドの対応する列に必ずUNSIGNEDを定義してください。VARCHAR(10)
はVARCHAR(20)を参照でき、その逆も可能です。 - 文字列型の FK 列は、対応する PK 列と同じ文字セットおよび照合順序を持つ必要があります。
- 子テーブルに既にデータがある場合、FK 列の各値は親テーブルの PK 列の値と一致する必要があります。次のようなクエリを使用してこれを確認します:
リーリー
これは、一致しない値をゼロ (0) 返す必要があります。明らかに、このクエリは一般的な例であるため、テーブル名と列名を置き換える必要があります。 - 親テーブルも子テーブルも
TEMPORARY
テーブルにすることはできません。 - 親テーブルも子テーブルも PARTITIONED テーブルにすることはできません。
- FK が
ON DELETE SET NULL
オプションを使用して宣言されている場合、FK 列は NULL 可能である必要があります。 - 外部キーの制約名を宣言する場合、その制約名は、制約が定義されているテーブル内だけでなく、スキーマ全体で一意である必要があります。 2 つのテーブルに同じ名前の独自の制約を設定することはできません。
- 新しい FK を作成しようとしているのと同じフィールドを指す他のテーブルに他の FK があり、それらの形式が不正である (つまり、照合順序が異なる) 場合は、最初にそれらの一貫性を保つ必要があります。これは、
SET FOREIGN_KEY_CHECKS = 0;
が一貫性のない関係として誤って定義された過去の変更が原因である可能性があります。これらの問題のある FK を特定する方法については、以下の @andrewdotn の回答を参照してください。
Hot Questions
Hot Tools
vc9-vc14 (32+64 ビット) ランタイム ライブラリ コレクション (以下のリンク)
phpStudy のインストールに必要なランタイム ライブラリのコレクションをダウンロードします。
VC9 32ビット
VC9 32 ビット phpstudy 統合インストール環境ランタイム ライブラリ
PHP プログラマー ツールボックスのフルバージョン
プログラマ ツールボックス v1.0 PHP 統合環境
VC11 32ビット
VC11 32ビットphpstudy統合インストール環境ランタイムライブラリ
SublimeText3 中国語版
中国語版、とても使いやすい
ホットトピック
20337
7
13531
4
11851
4
8836
17
8420
7





