web-dev-qa-db-ja.com

MySQL Errno 150

いくつかの単純なテーブルを作成していますが、この外部キーエラーを渡すことはできません。その理由はわかりません。以下にスクリプトを示します。

create TABLE Instructors (

ID varchar(10),
First_Name varchar(50) NOT NULL,
Last_Name varchar(50) NOT NULL,
PRIMARY KEY (ID)
);

create table Courses (

Course_Code varchar(10),
Title varchar(50) NOT NULL,
PRIMARY KEY (Course_Code)

);


create table Sections (
Index_No int,
Course_Code varchar(10),
Instructor_ID varchar(10),
PRIMARY KEY (Index_No),
FOREIGN KEY (Course_Code) REFERENCES Courses(Course_Code)
    ON DELETE cascade
    ON UPDATE cascade,
FOREIGN KEY (Instructor_ID) REFERENCES Instructors(ID)
    ON DELETE set default

);

エラーコード:1005。テーブル '336_project.sections'を作成できません(errno:150)

私のデータ型は同じように見え、構文は正しいようです。誰も私がここで見ないものを指摘できますか?

MySQL Workbench 5.2を使用しています

21
Sixers17

InnoDBエンジンを使用している場合、ON DELETE SET DEFAULTが問題です。マニュアルからの抜粋は次のとおりです。

MySQLサーバーではSET DEFAULTが許可されていますが、InnoDBでは無効として拒否されます。この句を使用したCREATE TABLEおよびALTER TABLEステートメントは、InnoDBテーブルでは許可されていません。

ON DELETE CASCADEまたはON DELETE SET NULLを使用できますが、ON DELETE SET DEFAULTは使用できません。より多くの情報があります こちら

24
Ed Gibbs

このエラーは、異なるタイプの列を関連付けている場合にも発生します。ソーステーブルのintおよび宛先テーブルのBigInt。

35
JohnL

走れます

SHOW ENGINE INNODB STATUS

失敗の理由を人間が読める形式で読み取る

例えば.

------------------------
LATEST FOREIGN KEY ERROR
------------------------
150331 15:51:01 Error in foreign key constraint of table foobar/#sql-413_81:
FOREIGN KEY (`user_id`) REFERENCES `foobar`.`users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE:
You have defined a SET NULL condition though some of the columns are defined as NOT NULL.
18
Riccardo Galli

ON DELETEをまったく指定していないが、InnoDBテーブルからMYISAMテーブルを参照しようとしている場合もあります。

CREATE TABLE `table1`(
    `id` INT UNSIGNED NOT NULL,
    `name` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=MYISAM CHARACTER SET UTF8;

CREATE TABLE `table2`(
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    `table1_id` INT UNSIGNED NOT NULL,
    `some_value` VARCHAR(255) NOT NULL,


    PRIMARY KEY (`id`),
    KEY `fk_table1_id`(`table1_id`),

    CONSTRAINT FOREIGN KEY (`table1_id`) REFERENCES `table1`(`id`)
) ENGINE=INNODB CHARACTER SET UTF8;

上記はerrno 15をスローします。これが機能するには、最初のテーブルもInnoDBに変更する必要があります。

3

別のテーブルを参照してFOREIGN KEYを作成するには、両方のテーブルのキーがPRIMARY KEYであり、同じデータ型である必要があります。

テーブルセクションでは、PRIMARY KEYは異なるデータ型、つまりINTですが、別のテーブルではVARCHAR型です。

3
Mayur Mahajan

に失敗しています

ON DELETE set default 

私は前にそれを見つけたことがなく、マニュアルにもそれを見ていません(しかし、それは遅くなります)

更新

これを manual で見ました

MySQLサーバーではSET DEFAULTが許可されていますが、InnoDBでは無効として拒否されます。この句を使用したCREATE TABLEおよびALTER TABLEステートメントは、InnoDBテーブルでは許可されていません。

InnoDBテーブルを使用していると思いますか?

1
Ian Kenney

ここで問題はデータベースエンジン(table1 MYISAMおよびtable2 ENGINE)にあります。外部キーを設定するには、

  • 両方のテーブルは同じENGINEと同じ文字セットである必要があります。
  • 親のPK列とFK列は、同じデータ型と同じ照合タイプでなければなりません。

あなたがアイデアを得たことを願っています。

0

完全を期すために、その時点で定義されていないテーブルへの外部参照を作成した場合にも、このエラーが発生します。

0
Duco

テーブルタイプがInnoDBであることを確認してください。MyISAMは外部キーafaikをサポートしていません。

0
Kadir Erturk