MySQL。テーブル errno 150 を作成できません
-
20-09-2019 - |
質問
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 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;
期待通りすべてが、その後動作するはずです。
他のヒント
、私は同様の問題に遭遇しました。私の場合は問題は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のワークベンチはあなたのためにそれを再作成してみましょう。その後、SQLをコピーします。私はerrno 150問題を修正しました。
私は第二テーブルの外部キーではなかったのに対し、unsigned
される最初のテーブルにIDを設定していたので、それがあった。この問題を抱えていた場合。それらを作るの両方unsigned
は私のためにそれを修正します。
必ず最初のマスタ/親テーブルを作成し、あなたの詳細/子テーブルを作成します。