web-dev-qa-db-ja.com

MySQL。テーブルerrno 150を作成できません

MySQLで2つのテーブルを持つデータベースを作成する必要がありますが、スクリプトはerrno 150(外部キーの問題)で失敗します。外部キーフィールドが両方のテーブルで同じになるように再確認しましたが、エラーは見つかりませんでした。

スクリプトは次のとおりです。

 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

 DROP SCHEMA IF EXISTS `testdb`;
 CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
 USE `testdb`;

 DROP TABLE IF EXISTS `testdb`.`table1` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   PRIMARY KEY (`id`) )

 ENGINE = InnoDB;


 DROP TABLE IF EXISTS `testdb`.`table2` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table2` (
   `id` INT NOT NULL AUTO_INCREMENT ,
   `field1` VARCHAR(50) NULL ,
   `date` DATE NULL ,
   `cnt` INT NULL ,
   PRIMARY KEY (`id`) ,
   INDEX `FK_table2_table1` (`field1` ASC) ,
   CONSTRAINT `FK_table2_table1`
   FOREIGN KEY (`field1`)
   REFERENCES `testdb`.`table1` (`field1` )
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)

 ENGINE = InnoDB;

 SET SQL_MODE=@OLD_SQL_MODE;
 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

異なるバージョンのMySQLを使用してWindowsとUbuntuで試しましたが、動作しませんでした。

何か案は?

68
David Espart

table1.field1にはインデックスが定義されていません。

FOREIGN KEYfield1制約を設定する必要があります。

これとともに:

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   KEY ix_table1_field1 (field1),
   PRIMARY KEY (`id`) )
 ENGINE = InnoDB;

その後、すべてが期待どおりに動作するはずです。

54
Quassnoi

MySQL WorkbenchとMySQL 5.5.27を使用しているときに、同様の問題が発生しました。私の場合、問題はINTタイプのフィールドにありました。 1つのテーブルでは誤ってINT UNSIGNEDであり、参照テーブルではINTでした。

49
Mushtaq Hussain

MySQLのバージョンによっては、最初にtable1.field1にインデックスを作成する必要がある場合があります。

13
atomice

ここでの回答の1つは、外部キーの整合性チェックを無効にすることを示唆しています。これは悪い考えです。ここには2つの犯人がいる可能性があります。

  • 参照される主キーと参照する外部キーのデータ型が一致しません
  • インデックス。インデックスを作成する外部キーはNOT NULLでなければなりません
8
jwilm

別のヒント:

データ型が同じように見える場合でも-私の場合、両方の列にVARCHAR(50)がありました-これでは十分ではありません。

また、両方の列が同じCOLLATIONを持っていることを確認する必要があります。

6
Alex

他の原因は、他のものとわずかに似ていますが、InnoDBの代わりにMyISAMエンジンを持っていることが判明したテーブルを参照していました。

5
Sherlock

参照テーブルの名前を誤って入力した場合にも、MySQLはこのエラーをスローします。 foreign key (column1) references mistyped_table(column1)の文字を見逃したことに気付くまで、しばらく髪を引き抜いた

5
Cfreak

オプション(場合に応じて)は、MySQL整合性チェックを無効にすることです。

SET FOREIGN_KEY_CHECKS = 0;
5
pl1nk

何も機能しない場合は、これを試してください:

外部キー名は、既存のキーの複製です。外部キーの名前がデータベース内で一意であることを確認してください。これをテストするには、キー名の末尾にランダムな文字をいくつか追加するだけです。

1
Arvind Bhardwaj

Mysqlワークベンチで作業していて、リレーションシップテーブルでこのエラーが発生した場合は、すぐに修正できる場合があります。削除してmysqlワークベンチで再作成してください。次に、SQLをコピーします。 errno 150の問題を修正しました。

0
clinical

外部キーを使用して一意でないフィールドを参照しようとしたときに、このエラーが発生しました。 (これは 明らかに は許可されていません)

0
Matthias

私にとって、問題はCREATE TABLEクエリでCONSTRAINTを使用することでした。

0
Patrick Moore

非常に奇妙なケースでは、データベースが壊れている可能性があります。私の場合、テーブルには外部キーがなく、テーブルの名前変更またはエンジンの変更のみが役立ちました。

InnoDBが壊れていたことがわかりました: https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted-while-試した?lq = 1

0
PiTheNumber

私の場合、おそらく同じ名前のテーブルを削除するサーバーのバグでした。 shcema全体をドロップして再作成することで問題が解決しました。

0
daVe

私はMySQL workBenchを使用していました。問題は、同じforeign key nameを使用できないことです。それらはuniqueである必要があります。したがって、複数のテーブルが同じ外部キーを参照する場合は、毎回unique名が必要です。

0

また、外部キーの複合キーを参照しようとすると、同じエラーが発生する場合があります。

例えば:

CREATE TABLE `article` (
  `id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  PRIMARY KEY (`id`,`type`)
) ENGINE InnoDB;

CREATE TABLE `t1` (
  `user_id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  `article_id` int(10) unsigned NOT NULL,
  CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

この場合、FK定義のarticle_idおよびtypeフィールドを、記事テーブルのPRIMARY KEY定義に表示されるのとまったく同じ順序で使用することが重要です。

0
crocodile2u

誰かがまだこれで問題を抱えている場合、私は上記のすべての解決策を試みました(SET FOREIGN_KEY_CHECKSを除く)が、何も機能しませんでした。問題は、最初のテーブルを参照するときに、一部のデータベースではテーブル名に関して大文字と小文字が区別されるということでした。これは変なことだと思います。MySQL、Oracleでこれを見たことがないので、MariaDBでこれが起こったからです。

例えば:

存在しない場合はテーブルを作成しますCADASTRO_MAQUINAS(Id VARCHAR(16)、Primary Key(Id));

存在しない場合は、テーブルを作成しますINFOS(Id_Maquina VARCHAR(16)NOT NULL、CONSTRAINT FK_infos_cadastro_maquinas外部キー(Id_Maquina)はCADASTRO_MAQUINAS(Id)を参照します);

CADASTRO_MAQUINASではなくcadastro_maquinas(小文字)を使用して2番目のテーブルを作成しようとすると、このエラーが表示されます。

0
Vini.g.fer

私の場合、1つのテーブルが、まだ存在していない別のテーブルで外部キー制約を使用していました。これは大きなメイクファイルが原因で発生していたので、予想したほど明白ではありませんでした。

0
Tyler Collier

この問題が発生したのは、最初のテーブルのidをunsignedに設定したのに対し、2番目のテーブルの外部キーはそうではなかったためです。それらを両方ともunsignedにすることで修正されました。

0
crmepham

私の場合、テーブルの1つで古いテーブル定義MyISAMを取得しましたが、別のテーブルから外部キーを作成することはできませんでした。たぶんこれは誰かを助ける。

したがって、これは2つのデータベース/フィールド定義の不整合が原因で発生する可能性があります。

Field Type
Field Collation
Table Engine
0
Radamanf

必ず最初にマスター/親テーブルを作成してから、詳細/子テーブルを作成してください。

0
Ruwan Jayalath

テーブルの1つで同様のエラーが発生しました。チェックすると、列照合は異なり、両方の列が同じ照合タイプに変更されると動作しました。

ここで提案されたソリューションのほとんどを読んだ後。このエラーをスローする可能性のあるすべての可能性を列挙するだけで役立つと思いました。

1、列のケースを確認2、列のコレクションを確認3、列の両方のテーブルにキーが作成されているかどうかを確認(一意、プライマリ)

0
bumblebee