2016-07-18 26 views
0

私は私のテーブルに外部キーを追加しようとしていますが、それは間違っていました:MYSQL外部キー制約を追加できませんか?

ERROR 1215 (HY000) at line 34: Cannot add foreign key constraint 

私は列の型をチェックし、それらが同じ型で、私は理由を理解することはできません。

そして私は、私がこれだSHOW ENGINE INNODB STATUS

を実行します。

2016-07-18 10:55:15 7f476acb6700 Error in foreign key constraint of table DGUT/staffCourse: 
FOREIGN KEY (teacher) REFERENCES staff (teacher) ON DELETE CASCADE 
) engine=innodb default charset=utf8: 
Cannot find an index in the referenced table where the 
referenced columns appear as the first columns, or column types 
in the table and the referenced table do not match for constraint. 
Note that the internal storage type of ENUM and SET changed in 
tables created with >= InnoDB-4.1.12, and such columns in old tables 
cannot be referenced by such columns in new tables. 

をそして、ここに私のコードです:

CREATE TABLE staff(
    id int(11) NOT NULL AUTO_INCREMENT, 
    department varchar(50) NOT NULL, 
    teacher varchar(50) NOT NULL, 
    gender varchar(50) NOT NULL, 
    title varchar(50) NOT NULL, 
    note1 varchar(50), 
    note2 varchar(50), 
    primary key (id) 
) engine=innodb default charset=utf8; 

CREATE TABLE staffCourse(
    id int(11) NOT NULL AUTO_INCREMENT, 
    teacher varchar(50) NOT NULL, 
    snum varchar(50) NOT NULL, 
    course varchar(50), 
    credit varchar(50), 
    teachWay varchar(50), 
    courseType varchar(50), 
    classNum varchar(50), 
    className varchar(50), 
    stuNum varchar(50), 
    week varchar(50), 
    section varchar(50), 
    location varchar(50), 
    CONSTRAINT FOREIGN KEY (teacher) REFERENCES staff (teacher) ON DELETE CASCADE, 
    primary key (id) 
) engine=innodb default charset=utf8; 

任意の提案をいただければ幸いです。

答えて

2

技術的には、これはあなたを大騒ぎにさせるでしょう。 teacherには、staffテーブルにキーがありません。それ以下です。マニュアルページUsing FOREIGN KEY Constraintsから

create schema aTestDb8282; 
use aTestDb8282; 

drop table if exists staff; 
CREATE TABLE staff(
    id int(11) NOT NULL AUTO_INCREMENT, 
    department varchar(50) NOT NULL, 
    teacher varchar(50) NOT NULL, 
    gender varchar(50) NOT NULL, 
    title varchar(50) NOT NULL, 
    note1 varchar(50), 
    note2 varchar(50), 
    primary key (id), 
    key `k_my_t_keyname` (teacher) 
) engine=innodb default charset=utf8; 

CREATE TABLE staffCourse(
    id int(11) NOT NULL AUTO_INCREMENT, 
    teacher varchar(50) NOT NULL, 
    snum varchar(50) NOT NULL, 
    course varchar(50), 
    credit varchar(50), 
    teachWay varchar(50), 
    courseType varchar(50), 
    classNum varchar(50), 
    className varchar(50), 
    stuNum varchar(50), 
    week varchar(50), 
    section varchar(50), 
    location varchar(50), 
    CONSTRAINT FOREIGN KEY (teacher) REFERENCES staff (teacher) ON DELETE CASCADE, 
    primary key (id) 
) engine=innodb default charset=utf8; 

drop schema aTestDb8282; -- clean up. Poof that db is gone 

: 外部キーチェックが速くなり、テーブルスキャンを必要としないことができるように

MySQLは外部キーと参照キーのインデックスが必要です。 参照表では、外部キー 列が同じ順序で最初の列としてリストされている索引が必要です。このような のインデックスは、 が存在しない場合は自動的に参照テーブルに作成されます。 外部キー制約を適用するために使用できる別のインデックスを作成すると、このインデックスは後で静かにドロップされることがあります。 index_nameが指定されている場合、前述のように使用されます。

これはいいデザインだとは言いませんでした。 teacherIdにはintなどがあります。おそらくあなたのstaffに戻るでしょう。 idしかし、私はあなたが何をしているのか理解する必要があります。

あなたがしていることはあいまいです。確かに、インデックスは2人以上のスタッフ(クイックルックアップのためにコースが複数または1つでもあった場合)を指し示すでしょう。それがFKとしてしたいことです:確認することです。

しかし、1つ以上あるとしましょう。はい、Sally Watkinsという先生がいます。しかし、それは繰り返すことができる名前ではなく、idに戻るべきです。それは悪いデザインです。

+0

キーワードは何を意味していますか?私はあなたと同じことをしています。私は構文ミスをしています –

+0

キーとインデックスは同義語です – Drew

+0

構文ミスを修正するには? –

関連する問題