質問

MySQL で 2 つのテーブルを持つデータベースを作成する必要がありますが、スクリプトはエラー番号 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;

Windows と Ubuntu でさまざまなバージョンの MySQL を試してみましたが、うまくいきませんでした。

何か案は?

役に立ちましたか?

解決

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;

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

他のヒント

MySQLのワークベンチとMySQL 5.5.27での作業中に

、私は同様の問題に遭遇しました。私の場合は問題はINTタイプフィールドとしました。誤って一つのテーブルにはUNSIGNED INTだったとテーブルを参照するにはINTでした。

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

ここでの答えの 1 つは、外部キーの整合性チェックを無効にすることを提案しています。これは悪い考えです。ここで考えられる犯人は次の 2 人です。

  • 参照される主キーと参照する外部キーの間のデータ型が一致しません
  • インデックス。インデックスを作成する外部キーは NULL でない必要があります

もう一つのヒント:

データ型が同じように見える場合でも、私の場合は両方の列に VARCHAR(50) - これはたりない。

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

さらに別の原因は、他の人に少し似ていますが:私の代わりにInnoDBテーブルの、MyISAMのエンジンを持っていることが判明したテーブルを参照して、

あなたが参照するテーブルの名前をタイプミス場合は、

MySQLのも、このエラーがスローされます。私はforeign key (column1) references mistyped_table(column1)で手紙を逃し実現するまで私はしばらくの間、私の髪を引き抜い

(場合によっては)オプションはMySQLの整合性チェックを無効にするだろう

SET FOREIGN_KEY_CHECKS = 0;

何も動作した場合、これを試してみます:

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

私の場合は、一つのテーブルがまだ存在していなかった別のテーブルに外部キー制約を使用していました。これは、大規模なメイクに起こっていたので、私が期待しただろうほど明らかではなかった。

誰かがまだこれで問題が発生している場合は、私が(SET FOREIGN_KEY_CHECKSを除く)上記のすべてのソリューションを試してみましたが、何も働きました。問題は、あなたが最初のテーブルを参照する際に、一部のデータベースは、テーブル名について、大文字と小文字を区別していることでした。私は、私は、MySQL、Oracleでこの前に見たことがないと、今これはMariaDBに私のために起こったので、これは奇妙だと思います。

CADASTRO_MAQUINASを(存在しない場合は、

テーブルを作成します。 ID VARCHAR(16)、 主キー(ID) );

INFOSを(存在しない場合は、

テーブルを作成します。 Id_Maquina VARCHAR(16)NOT NULLと、 CONSTRAINT FK_infos_cadastro_maquinas外部キー(Id_Maquina)がCADASTRO_MAQUINAS(同上)を参照します );

私が代わりにCADASTRO_MAQUINASのcadastro_maquinas(下の例)を用いて、第2のテーブルを作成しようとすると、

、私はこのエラーを受け取ることになります。

私はMySQL workBenchを使用していました。問題は、彼らがforeign key nameする必要がある、あなたは同じuniqueを使用することはできませんです。複数のテーブルが同じ外部キーを参照しますのであれば、それぞれの時間が与えられたunique名が存在する必要があります。

私は私のテーブルのいずれかに類似したエラーが発生しました。確認列照合は、かつて同じ照合タイプに両方の列を変更働いている。

、異なっていた場合には

ここで提案された解決策のほとんどを読んだ後。私はちょうど私がちょうどこのエラーを投げることができるすべての可能性をダウンリストならば、それは役に立つかもしれないと思っています。

1、列のCASEをチェック 2、列の照合をチェック 3、列の両方のテーブルに作成したキーがないか確認してください(ユニーク、プライマリ)

私の場合は、1つの表の古いテーブル定義のMyISAMを持って、明らかに私は別のテーブルからそれへの外部キーを作成することができませんでした。多分これは誰かを助けます。

これが起こるかもしれませんので、二つのデータベース/フィールド間の矛盾の定義は、チェックしてみます:

Field Type
Field Collation
Table Engine

私にとっては、問題がCONSTRAINTクエリでCREATE TABLEを使用していました。

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

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

この場合、彼らが、articleテーブルPRIMARY KEYの定義に表示される非常に同じ順序でFK定義の中のarticle_idとタイプフィールドを使用することが重要である。

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

は、非常に奇妙なケースでは、あなたのデータベースが壊れている可能性があります。私の場合は、テーブルの上の任意の外部キーを持っていなかったと、テーブルの名前を変更するか、エンジンを変更するだけで助けます。

は、参照、InnoDBのが壊れていたが判明:<のhref = "https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-削除-しばらく-しようとしたツー?LQ = 1" > https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted -while-試みツー?LQ = 1 の

あなたがMySQLのワークベンチで作業しているとあなたが関係テーブルのために、このエラーが出る場合は、

あなたのための迅速な修正があるかもしれません。ただ、それを削除し、MySQLのワークベンチはあなたのためにそれを再作成してみましょう。その後、SQLをコピーします。私はerrno 150問題を修正しました。

非一意のフィールドを参照するために、外部キーを使用しようとしているときに

私はこのエラーを得ました。 (これは許可されていないを明らかにhref="https://stackoverflow.com/a/18384404/5272567">

私は第二テーブルの外部キーではなかったのに対し、unsignedされる最初のテーブルにIDを設定していたので、それがあった。この問題を抱えていた場合。それらを作るの両方unsignedは私のためにそれを修正します。

必ず最初のマスタ/親テーブルを作成し、あなたの詳細/子テーブルを作成します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top