2010年02月10日(Wednesday)
[ MySQL ] show innodb statusで「Cannot resolve table name close to」といった内容でエラーが…
MySQLでテーブルを作成していたところ、表題のようなタイトルのエラーが出てテーブルが作成できないことが発生!
ちなみに普通に画面に表示されるエラーメッセージを書くと
「ERROR 1005 (HY000): Can't create table './DB名/テーブル名.frm' (errno: 150)」
こんな内容。
ちなみに1005系のエラーメッセージは外部参照がらみ。
そして、エラーメッセージでググってみて出てくるのが大体
1.参照元と参照先でのデータ型が違う
# 例えば参照元がINTで、参照先がSMALLINTといった感じ
2.ディスク容量不足によりテーブル作成できなかった
が多いでしょうか。
特に1番が多いような気がします。
# 当然っちゃ当然?
ちなみにMySQLで外部参照を使う為には「InnoDB」でテーブルを作成しなければなりません。
なので、上記エラーが出たらまずは
「show innodb status」
にてinnodb絡みの出力をチェックします。
そうすると、エラーログの部分がありますので、そちらを参照します。
ちなみに今回発生した内容は……
Error in foreign key constraint of table データベース名/テーブル名:
FOREIGN KEY(~) REFERENCES contents(...)
~省略~
)TYPE=INNODB:
Cannot resolve table name close to:
(...)
~省略~
)TYPE=INNODB
といったタイトルにあるようなエラー内容。
いまいちわかりづらい内容なので、再度グーグル先生にて検索してみると…
MySQL Forums :: Constraints :: Cannot resolve table name close to...
こんな内容がヒットしました。
まさにほぼ同一内容。
それに対する回答をみてみると…
「maybe type of table is not in concert. (恐らくテーブル型が同じでないのでは…)」
というものでした。
なるほど…テーブルの型が違う…のか………!?
ということで、参照先のテーブルを調べてみました。
「show create table 参照先テーブル」
参照元テーブルのテーブル作成の内容を確認するコマンドですね。
CREATE TABLE 参照先テーブル名 (
~省略~
)ENGINE=MyISAM;
…/(^o^)\
参照先のテーブルが「MyISAM型」で作成されておりましたorz
そこで早速参照先テーブルのデータをdumpしたのちに作りなおしました。
CREATE TABLE 参照先テーブル名 (
~省略~
)ENGINE=InnoDB;
そして、再度参照元のテーブルを作成しましたところ…
SQLを変更することなく作成完了!
いやはや…思わぬトラップでした…
ということで今回の結論。
「Cannot resolve table name close to」
メッセージが出た場合には、テーブル型も調べてみる事。
# 今回はMyISAM型テーブルが紛れ込んでた関係のエラーということですね。
ということでした。
ちなみに普通に画面に表示されるエラーメッセージを書くと
「ERROR 1005 (HY000): Can't create table './DB名/テーブル名.frm' (errno: 150)」
こんな内容。
ちなみに1005系のエラーメッセージは外部参照がらみ。
そして、エラーメッセージでググってみて出てくるのが大体
1.参照元と参照先でのデータ型が違う
# 例えば参照元がINTで、参照先がSMALLINTといった感じ
2.ディスク容量不足によりテーブル作成できなかった
が多いでしょうか。
特に1番が多いような気がします。
# 当然っちゃ当然?
ちなみにMySQLで外部参照を使う為には「InnoDB」でテーブルを作成しなければなりません。
なので、上記エラーが出たらまずは
「show innodb status」
にてinnodb絡みの出力をチェックします。
そうすると、エラーログの部分がありますので、そちらを参照します。
ちなみに今回発生した内容は……
Error in foreign key constraint of table データベース名/テーブル名:
FOREIGN KEY(~) REFERENCES contents(...)
~省略~
)TYPE=INNODB:
Cannot resolve table name close to:
(...)
~省略~
)TYPE=INNODB
といったタイトルにあるようなエラー内容。
いまいちわかりづらい内容なので、再度グーグル先生にて検索してみると…
MySQL Forums :: Constraints :: Cannot resolve table name close to...
こんな内容がヒットしました。
まさにほぼ同一内容。
それに対する回答をみてみると…
「maybe type of table is not in concert. (恐らくテーブル型が同じでないのでは…)」
というものでした。
なるほど…テーブルの型が違う…のか………!?
ということで、参照先のテーブルを調べてみました。
「show create table 参照先テーブル」
参照元テーブルのテーブル作成の内容を確認するコマンドですね。
CREATE TABLE 参照先テーブル名 (
~省略~
)ENGINE=MyISAM;
…/(^o^)\
参照先のテーブルが「MyISAM型」で作成されておりましたorz
そこで早速参照先テーブルのデータをdumpしたのちに作りなおしました。
CREATE TABLE 参照先テーブル名 (
~省略~
)ENGINE=InnoDB;
そして、再度参照元のテーブルを作成しましたところ…
SQLを変更することなく作成完了!
いやはや…思わぬトラップでした…
ということで今回の結論。
「Cannot resolve table name close to」
メッセージが出た場合には、テーブル型も調べてみる事。
# 今回はMyISAM型テーブルが紛れ込んでた関係のエラーということですね。
ということでした。

