エラー:mysql foreign key errno 150


Mysqlエラー:ERROR 1005(HY 000):Can't create table'mytable.#sql-191_1c5e4' (errno: 150)
alter table message_demo add cons
traint foreign key(type) references message_type(id) on delete cascade;

理由はmessage_demoテーブルのtype(外部キー)プロパティとmessage_typeテーブルのid(プライマリ・キー)定義は異なり、私はテーブルを確立した後に確立した外部キー関係であるため、typeフィールドにunsignedを追加したが、idフィールドは追加しなかったため、エラーを報告した.
参照先:http://forums.devarticles.com/mysql-development-50/mysql-foreign-key-problem-errno-150t-7704.html
Finally. I found out what the problem was. It wasn't about the definition of the foreign key. actually it was the definition of the primary key field.
長いこと外部キーを使用していないので、カスケード操作は少し覚えていません.
以下の資料は公式文書(MySQL 5.1 Reference Manual-cn)から来ています.
15.2.6.4節、「FOREGN KEY制約」
外部キー定義は次の場合に従います.
・すべてのtablesはInnoDB型でなければなりません.一時テーブルではありません.
・参照テーブルには、外部キー列が同じ順序で最初の列として列挙されるインデックスが必要です.このようなインデックスが存在しない場合は、参照テーブルに自動的に作成される必要があります.
・参照テーブルには、最初のカラムとして同じ順序で列挙されたインデックスが必要です.
・外部キー列のインデックス接頭辞はサポートされていません.このような結果の1つは、BLOB列とTEXT列が外部キーに含まれないことであり、これらの列のインデックスには常にプレフィックス長が含まれなければならないからである.
・COSTRAINTsymbolが与えられる場合、データベース内で一意である必要があります.与えられていない場合、InnoDBは自動的にこの名前を作成します. 
1.8.5.5.外部キー
外部キーの強化は、データベース開発者にとって多くのメリットを提供します.
・関連設計が適切であると仮定し、外部キー制約によりプログラマがデータベースに不一致性を導入することが困難になる.
・データベース・サーバは、一元化された制約チェック機能を備えているため、アプリケーション側でこのようなチェックを実行する必要はありません.これにより、異なるアプリケーションが異なる方法で制約をチェックする可能性がなくなります.
・カスケード更新と削除を用いて、アプリケーションコードを簡略化する.
・適切な外部キーの設計は、テーブル間の関係をドキュメントで記録するのに役立つ.
これらのメリットは、データベース・サーバが必要なチェックを実行するために必要とする追加のオーバーヘッドの代価であることを覚えておいてください.サーバの追加チェックはパフォーマンスに影響します.一部のアプリケーションでは、この機能は人気がありません.できるだけ避けてください.(このため、いくつかの主要なビジネスアプリケーションでは、外部キーロジックがアプリケーションレベルで実装されている).