web-dev-qa-db-ja.com

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

私はインターネットでこの問題の解決策を探し、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
99
lamostreta

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

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

既知の原因には次のものがあります。

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

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

261
user319198

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

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

SET FOREIGN_KEY_CHECKS=0;

そして、それは動作します。

11
happyhardik

マスターテーブルが削除されたことが原因の場合もありますが(foreign_key_checksを無効にすることにより)、外部キーCONSTRAINTが他のテーブルにまだ存在しています。 myの場合、テーブルを削除して再作成しようとしましたが、同じエラーがスローされていました。

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

4
rajug

非常に多くの場合、外部キーと参照キーが同じタイプまたは同じ長さでない場合に発生します。

3
zahid9i

同様のエラーが発生しました。問題は、子テーブルと親テーブルが同じ文字セットと照合順序を持たないことに関係していました。これは、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
user2258168

エラーコード:1005

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

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

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

2
Rajiv Nair

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

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

外部キーは、参照する主キーとまったく同じタイプである必要があります。この例では、タイプが「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';
1

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

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

versus

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

MySQLはなぜこのようなテーブルが存在しないとMySQLが判断できないのでしょうか...

1
Csongor Halmai

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

0
rkawano

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

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 ;
0
Damir Olejar