106

この問題の解決策をインターネットで検索し、スタック オーバーフローの質問を確認しましたが、私のケースでは解決策はありませんでした。

テーブル 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
4

13 に答える 13

275

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

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

いくつかの既知の原因は次のとおりです。

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

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

于 2012-01-26T13:26:25.280 に答える
4

外部キーと参照キーが同じ型または同じ長さを持たない場合に、非常に頻繁に発生します。

于 2014-08-25T12:29:10.350 に答える
2

エラーコード: 1005

私は同様の問題を抱えていたので、ここで私が試したことをいくつか紹介します(解決策を除いて、順不同です:))

  1. 外部キー名を変更しました(機能しませんでした)
  2. 外部キーの長さを短縮
  3. データ型を確認しました(何も悪いことはありません)
  4. インデックスをチェック
  5. 照合順序を確認してください(すべて問題ありません、もう一度やり直してください)
  6. 役に立たないテーブルを切り捨てました
  7. テーブルを削除して再作成しました
  8. 循環参照が作成されているかどうかを確認しようとしました --- すべて問題ありません
  9. 最後に、2 つのエディターが開いていることがわかりました。1 つは PhpStorm (JetBrains) にあり、もう 1 つは MySQL ワークベンチです。PhpStorm / MySQL Workbench が何らかの編集ロックを作成しているようです。

    ロックが発生したかどうかを確認するためだけに PhpStorm を閉じました (逆の場合もありました)。これで私の問題は解決しました。

于 2016-05-07T03:18:22.097 に答える
2

同様のエラーがありました。問題は、子テーブルと親テーブルが同じ文字セットと照合順序を持っていないことに関係していました。これは、ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; を追加することで修正できます。

CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

... SQL ステートメントでは、いくつかのコードが欠落していることを意味します。

于 2016-07-14T08:34:40.633 に答える
1

MyISAM について言及したばかりです。単純にENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 を追加してみてください。ステートメントの最後に、他のテーブルが MyISAM で作成されたと仮定します。

CREATE TABLE IF NOT EXISTS `tablename` (
  `key` bigint(20) NOT NULL AUTO_INCREMENT,
  FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
于 2016-01-20T23:29:35.967 に答える
1

私の場合、一方のテーブルが InnoB で、もう一方が MyISAM のときに発生しました。MySQL Workbench を使用して、1 つのテーブルのエンジンを変更すると解決します。

于 2016-03-28T02:01:48.400 に答える
1

制約宣言で参照されているテーブルの名前が正しくなかったため、私の場合に発生しました(テーブル名の大文字を忘れました):

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
于 2015-03-10T15:45:05.597 に答える