68

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 で試しましたが、うまくいきませんでした。

何か案は?

4

22 に答える 22

54

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;

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

于 2009-11-17T14:46:18.353 に答える
49

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

于 2013-05-10T20:26:21.060 に答える
13

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

于 2009-11-17T14:45:29.487 に答える
6

別のヒント:

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

また、両方の列が同じであることを確認する必要がありますCOLLATION

于 2013-05-22T07:48:01.753 に答える
5

参照テーブルの名前を間違えた場合にも、MySQL はこのエラーをスローします。手紙を見逃したことに気付くまで、しばらく髪を引っ張ったforeign key (column1) references mistyped_table(column1)

于 2013-12-31T00:21:31.047 に答える
5

オプション (ケースによって異なります) は、MySQL の整合性チェックを無効にすることです。

SET FOREIGN_KEY_CHECKS = 0;
于 2013-02-05T14:12:18.093 に答える
1

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

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

于 2012-10-26T05:26:39.827 に答える
1

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

于 2016-08-16T12:05:51.893 に答える
0

誰かがまだこれで問題を抱えている場合は、上記のすべての解決策(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番目のテーブルを作成しようとすると、このエラーが発生します。

于 2013-02-21T12:52:19.673 に答える
0

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

于 2015-03-21T11:13:32.397 に答える
0

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

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

Field Type
Field Collation
Table Engine
于 2013-12-13T11:44:14.130 に答える
0

私にとって、問題はクエリでCONSTRAINTの使用にありました。CREATE TABLE

于 2014-06-12T19:19:49.060 に答える
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 フィールドを、article テーブルの PRIMARY KEY 定義に現れるのとまったく同じ順序で使用することが重要です。

于 2014-12-29T19:40:01.330 に答える
0

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

于 2013-04-06T05:49:00.553 に答える
0

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

于 2013-02-01T04:40:20.117 に答える
0

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

于 2013-02-09T05:58:06.313 に答える
0

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

于 2016-03-28T11:28:08.923 に答える