1. ホーム
  2. mysql

[解決済み] エラーコードです。1005. テーブル'...'を作成できません。(errno: 150)

2022-10-28 22:22:06

質問

この問題の解決策をインターネットで検索し、Stack Overflowの質問を確認しましたが、私のケースではどの解決策もうまくいきませんでした。

私はテーブルsira_noからmetal_kodへの外部キーを作成したいです。

ALTER TABLE sira_no
    ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
    REFERENCES metal_kod(METAL_KODU)
    ON DELETE SET NULL
    ON UPDATE SET NULL ;

このスクリプトは返します。

Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)

参照されるテーブルにインデックスを追加してみました。

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);

両方のテーブルでMETAL_KODUをチェックしましたが(文字セットと照合順序)、この問題の解決策を見つけることができませんでした。どうすればこの問題を解決できるでしょうか?

ここに、metal_kod テーブルがあります。

METAL_KODU    varchar(4)    NO    PRI
DURUM    bit(1)    NO
METAL_ISMI    varchar(30)    NO
AYAR_YOGUNLUK    smallint(6)    YES        100

どのように解決するのですか?

エラーコードです。1005 -- あなたのコードに間違った主キーの参照があります。

通常、存在しない外部キーフィールドが参照されていることが原因です。タイプミスがあるか、同じであるべきケースをチェックしているか、フィールドタイプの不一致があるのかもしれません。外部キーにリンクされたフィールドは、定義と正確に一致する必要があります。

いくつかの既知の原因が考えられます。

  1. 2 つのキー フィールドのタイプおよび/またはサイズが正確に一致しない。例えば、一方が INT(10) である場合、キーフィールドは INT である必要があり BIGINT または SMALLINT または TINYINT . また、一方が SIGNED であること、そしてもう一方が UNSIGNED . どちらも全く同じである必要があります。
  2. 参照しようとしているキー フィールドの 1 つにインデックスがないか、またはプライマリ キーでありません。リレーションシップのフィールドの 1 つが主キーでない場合、そのフィールドにインデックスを作成する必要があります。
  3. 外部キー名がすでに存在するキーと重複している。外部キーの名前がデータベース内で一意であることを確認します。キー名の末尾にランダムな文字を数文字追加して、これをテストしてください。
  4. 1 つまたは両方のテーブルが MyISAM テーブルでなければなりません。外部キーを使うには、テーブルの両方が InnoDB . (実際には、もし両方のテーブルが MyISAM である場合、エラーメッセージは表示されません - キーが作成されないだけです)。クエリブラウザでは、テーブルの種類を指定することができます。
  5. カスケードが指定されている ON DELETE SET NULL となっていますが、関連するキーフィールドには NOT NULL . この問題は、カスケードを変更するか、フィールドで NULL の値を許可するように設定することです。
  6. Charset と Collate のオプションが、テーブル レベルとキー列の個々のフィールド レベルの両方で同じであることを確認します。
  7. 外部キー列にデフォルト値 (つまり、default=0) が設定されています。
  8. リレーションシップのフィールドの 1 つが複合 (コンポジット) キーの一部であり、それ自身の個別のインデックスを持っていない。フィールドが複合キーの一部としてインデックスを持っていても、制約で使用するには、そのキーフィールドだけのために個別のインデックスを作成する必要があります。
  9. に構文エラーがあります。 ALTER ステートメントに構文エラーがあるか、リレーションシップのフィールド名のひとつを間違えています。
  10. 外部キーの名前が最大長である 64 文字を超えています。

詳細は、以下を参照してください。 MySQL エラー番号 1005 テーブルを作成できません。