2010年06月03日
InnoDBとMyISAMを混同させるときの注意点
MySQLのInnoDBで外部キー制約をMyISAMに対して行った場合、insertするとエラーになってなやまされました。
何回インサートしても外部キーが指定されてないてきなメッセージが・・・。
状況的にはこんな感じです。
classテーブル
<td>
int autor increment
</td>
<td>
varchar(45)
</td>
studentテーブル
<td>
int autor increment
</td>
<td>
int
</td>
<td>
varchar(255)
</td>
<td>
int3
</td>
ER図
studentテーブルが、class_class_idを元にclassテーブルを参照しているという状況です。
まずclassテーブルに1件データを入れておきます
insert into class (class_name) values ("情報処理科");
次にstudentテーブルにこんな感じでインサートしてみます。
insert into student (class_class_id,name,age) values (1,"五郎",53);
これを実行すると以下のようなエラーがでます。
#1452 - Cannot add or update a child row: a foreign key constraint fails (`mydb/student`, CONSTRAINT `fk_student_class` FOREIGN KEY (`class_class_id`) REFERENCES `class` (`class_id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
すげー悩んだんですが、どうやら原因は外部キーに設定しているテーブルがMyISAMだったからのようです。
よく考えたら、MyISAMは参照整合性をサポートしていないのでエラーがでて当然です・・・。
MySQL WorkbenchでInnoDBとMyISAMで外部キー設定したら警告ぐらい出てもくれてもいいのになーとか思ったりして・・・w