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で試しましたが、動作しませんでした。
何か案は?
table1.field1
にはインデックスが定義されていません。
FOREIGN KEY
にfield1
制約を設定する必要があります。
これとともに:
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;
その後、すべてが期待どおりに動作するはずです。
MySQL WorkbenchとMySQL 5.5.27を使用しているときに、同様の問題が発生しました。私の場合、問題はINTタイプのフィールドにありました。 1つのテーブルでは誤ってINT UNSIGNEDであり、参照テーブルではINTでした。
MySQLのバージョンによっては、最初にtable1.field1にインデックスを作成する必要がある場合があります。
ここでの回答の1つは、外部キーの整合性チェックを無効にすることを示唆しています。これは悪い考えです。ここには2つの犯人がいる可能性があります。
別のヒント:
データ型が同じように見える場合でも-私の場合、両方の列にVARCHAR(50)
がありました-これでは十分ではありません。
また、両方の列が同じCOLLATION
を持っていることを確認する必要があります。
他の原因は、他のものとわずかに似ていますが、InnoDBの代わりにMyISAMエンジンを持っていることが判明したテーブルを参照していました。
参照テーブルの名前を誤って入力した場合にも、MySQLはこのエラーをスローします。 foreign key (column1) references mistyped_table(column1)
の文字を見逃したことに気付くまで、しばらく髪を引き抜いた
オプション(場合に応じて)は、MySQL整合性チェックを無効にすることです。
SET FOREIGN_KEY_CHECKS = 0;
何も機能しない場合は、これを試してください:
外部キー名は、既存のキーの複製です。外部キーの名前がデータベース内で一意であることを確認してください。これをテストするには、キー名の末尾にランダムな文字をいくつか追加するだけです。
Mysqlワークベンチで作業していて、リレーションシップテーブルでこのエラーが発生した場合は、すぐに修正できる場合があります。削除してmysqlワークベンチで再作成してください。次に、SQLをコピーします。 errno 150の問題を修正しました。
外部キーを使用して一意でないフィールドを参照しようとしたときに、このエラーが発生しました。 (これは 明らかに は許可されていません)
私にとって、問題はCREATE TABLE
クエリでCONSTRAINT
を使用することでした。
非常に奇妙なケースでは、データベースが壊れている可能性があります。私の場合、テーブルには外部キーがなく、テーブルの名前変更またはエンジンの変更のみが役立ちました。
InnoDBが壊れていたことがわかりました: https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted-while-試した?lq = 1
私の場合、おそらく同じ名前のテーブルを削除するサーバーのバグでした。 shcema全体をドロップして再作成することで問題が解決しました。
私はMySQL workBench
を使用していました。問題は、同じforeign key name
を使用できないことです。それらはunique
である必要があります。したがって、複数のテーブルが同じ外部キーを参照する場合は、毎回unique
名が必要です。
また、外部キーの複合キーを参照しようとすると、同じエラーが発生する場合があります。
例えば:
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定義に表示されるのとまったく同じ順序で使用することが重要です。
誰かがまだこれで問題を抱えている場合、私は上記のすべての解決策を試みました(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番目のテーブルを作成しようとすると、このエラーが表示されます。
私の場合、1つのテーブルが、まだ存在していない別のテーブルで外部キー制約を使用していました。これは大きなメイクファイルが原因で発生していたので、予想したほど明白ではありませんでした。
この問題が発生したのは、最初のテーブルのidをunsigned
に設定したのに対し、2番目のテーブルの外部キーはそうではなかったためです。それらを両方ともunsigned
にすることで修正されました。
私の場合、テーブルの1つで古いテーブル定義MyISAMを取得しましたが、別のテーブルから外部キーを作成することはできませんでした。たぶんこれは誰かを助ける。
したがって、これは2つのデータベース/フィールド定義の不整合が原因で発生する可能性があります。
Field Type
Field Collation
Table Engine
必ず最初にマスター/親テーブルを作成してから、詳細/子テーブルを作成してください。
テーブルの1つで同様のエラーが発生しました。チェックすると、列照合は異なり、両方の列が同じ照合タイプに変更されると動作しました。
ここで提案されたソリューションのほとんどを読んだ後。このエラーをスローする可能性のあるすべての可能性を列挙するだけで役立つと思いました。
1、列のケースを確認2、列のコレクションを確認3、列の両方のテーブルにキーが作成されているかどうかを確認(一意、プライマリ)