いくつかの単純なテーブルを作成していますが、この外部キーエラーを渡すことはできません。その理由はわかりません。以下にスクリプトを示します。
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を使用しています
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
は使用できません。より多くの情報があります こちら 。
このエラーは、異なるタイプの列を関連付けている場合にも発生します。ソーステーブルのintおよび宛先テーブルのBigInt。
走れます
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.
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に変更する必要があります。
別のテーブルを参照してFOREIGN KEY
を作成するには、両方のテーブルのキーがPRIMARY KEY
であり、同じデータ型である必要があります。
テーブルセクションでは、PRIMARY KEY
は異なるデータ型、つまりINT
ですが、別のテーブルではVARCHAR
型です。
に失敗しています
ON DELETE set default
私は前にそれを見つけたことがなく、マニュアルにもそれを見ていません(しかし、それは遅くなります)
更新
これを manual で見ました
MySQLサーバーではSET DEFAULTが許可されていますが、InnoDBでは無効として拒否されます。この句を使用したCREATE TABLEおよびALTER TABLEステートメントは、InnoDBテーブルでは許可されていません。
InnoDBテーブルを使用していると思いますか?
ここで問題はデータベースエンジン(table1 MYISAM
およびtable2 ENGINE
)にあります。外部キーを設定するには、
あなたがアイデアを得たことを願っています。
完全を期すために、その時点で定義されていないテーブルへの外部参照を作成した場合にも、このエラーが発生します。
テーブルタイプがInnoDBであることを確認してください。MyISAMは外部キーafaikをサポートしていません。