エラーコード:1005。テーブル '…'を作成できません(エラー番号:150)


103

私はインターネットでこの問題の解決策を探し、スタックオーバーフローの質問を確認しましたが、私の解決策はどれもうまくいきませんでした。

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

両方のテーブル(charsetとcollat​​ion)で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

metal_kodテーブルのスキーマを表示できますか?外部キーが参照する必要があるのは、そのテーブルのどのフィールドですか?
マンス2012年

回答:


271

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

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

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

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

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


4
問題は、外部キーの文字セットが一致しないことでした。答えてくれてありがとう。
lamostreta 2012年

4
SHOW ENGINE INNODB STATUSこの質問で述べたように、私の特定の問題(私の場合はPEBCAK)の診断に役立ちました
Hobo

1
いまいましい、それさえ主キーです。そのキーの個別のインデックスを作成する必要があります。おかげでこれは私の問題を解決しました。
RSB

3
#4が私の問題でした-テーブルの1つはMyISAMで、スクリプトはInnoDBテーブルを作成しようとしました。最初にMySQL 5.0または同様のバージョンを実行していて、デフォルトのストレージエンジンがMyISAMでスクリプトが正常に実行されていた古いシステムをデプロイしようとしたときに、この問題に遭遇しました。現在の環境は5.5で、デフォルトのストレージはInnoDBです。set names 'utf8', storage_engine=MYISAM;スクリプトの最初に追加すると、問題が解決しました。複雑な回答をありがとう@ user319198と@Stefano!:o)
ボリス・チェルベンコフ2013

1
鉱山には#1で述べたように「unsigned」属性がありませんでした、ありがとう!
2015年

11

これは、データベースをあるサーバーから別のサーバーにエクスポートし、テーブルがデフォルトでアルファベット順にリストされている場合にも発生する可能性があります。
したがって、最初のテーブルに、まだ作成されていない別のテーブルの外部キーを含めることができます。このような場合は、foreign_key_checksを無効にしてデータベースを作成してください。

次のコードをスクリプトに追加するだけです。

SET FOREIGN_KEY_CHECKS=0;

そしてそれはうまくいくでしょう。


4

外部キーと参照キーが同じ型または同じ長さではない場合によく発生します。


4

マスターテーブルが削除されたことが原因である可能性がありますが(foreign_key_checksを無効にすることで)、外部キーCONSTRAINTが他のテーブルにまだ存在しています。で、私の場合、私は、テーブルをドロップして再作成しようとしたが、それは私のために同じエラーを投げていたていました。

したがって、すべてのテーブルからすべての外部キーCONSTRAINTを削除してみてから、テーブルを更新または作成してください。


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ステートメントの...は、いくつかの不足しているコードがあることを意味します。


2

外部キーは、参照する主キーとまったく同じタイプである必要があります。この例では、タイプが「INT UNSIGNED NOT NULL」であり、前のキーも「INT UNSIGNED NOT NULL」である必要があります。

CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';

署名されていないことが問題でした。ありがとう!
Gabo

2

エラーコード:1005

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

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

    私はPhpStormを閉じて、ロックされているかどうかを確認しました(逆の可能性もありました)。これは私の問題を解決しました。


2

まったく同じエラーメッセージが表示されました。最後に、コマンドのテーブル名のスペルを間違えたことがわかりました。

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);

MySQLがこのようなテーブルが存在しないことを地球上で認識できないのはなぜでしょうか。


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 ;

1

私の場合、1つのテーブルがInnoBで、他のテーブルがMyISAMであるときに発生しました。MySQL Workbenchを介して1つのテーブルのエンジンを変更することで解決します。


1

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

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

1

両方のテーブルのスキーマInnoDB MyISAMが同じであることを確認してください。私は私の場合InnoDBですべて同じにして働きました


1

私の問題はリストされていませんでした、それはとてもばかげたものでした..... FKPK としてあるテーブルは、PK次のように宣言された複合でした:主キー(CNPJCEP)CEPフィールドをFK別のテーブルに入れたいと思っていました。このエラーで立ち往生し、ストーリーの教訓は主キー(CEPCNPJ)の上記のコードを逆にしただけで機能しました。友達にチップを渡します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.