MySQLが外部キーを作成できない理由と解決方法


関連表2枚の場合、外鍵を作成できない場合がありますが、このブログから見て、問題は6時のCharsetとCollateのオプションがテーブルレベルとフィールドレベルで一致しています。私の2つのテーブルのコードcharsetとcollateは一致しません。2つのテーブルはSQL文を実行します。

alter table    convert to character set utf8;
問題を完璧に解決する。
ps:以下のMySQLを見ても、外キーのプロパティを作成できません。
MyISAMとInnoDB解説
InnoDBとMyISAMは多くの人がMySQLを使う時に一番よく使う表タイプです。この二つのタイプはそれぞれ優劣があり、具体的な応用によって決まります。基本的な違いは、MyISAMタイプは事務処理などの高度な処理に対応しておらず、InnoDBタイプはサポートしています。MyISAMタイプの表は、パフォーマンスを強調し、InnoDBタイプよりも実行数が速いが、事務サポートは提供されておらず、InnoDBは事務サポートや外部キーなどの高度なデータベース機能を提供している。
以下は詳細と具体的な実装の違いです。
◆1.InnoDBはFLLTEXTタイプのインデックスに対応していません。
◆2.InnoDBに表の具体的な行数を保存しない、つまり、select count(*)fromテーブルを実行する時、InnoDBは表全体をスキャンして何行あるかを計算しますが、MyISAMは保存された行数を簡単に読み取ればいいです。count(*)文にwhere条件が含まれている場合は、両表の動作は同じです。
◆3.AUTO_に対してINCREMENTタイプのフィールドは、InnoDBにはこのフィールドだけのインデックスが含まれていなければなりませんが、MyISAMテーブルでは、他のフィールドと一緒に結合インデックスを作成することができます。
◆4.DELETE FROMテーブルの場合、InnoDBはテーブルを再構築せず、一行の削除です。
◆5.LOAD TABLE FROM MASTER操作はInnoDBには機能しません。解決方法はまずInnoDBテーブルをMyISAMテーブルに変更し、データを導入してからInnoDBテーブルに変更しますが、使用する追加のInnoDB特性(例えば、外部キー)の表は適用されません。
また、InnoDBテーブルの行ロックも絶対的ではありません。SQL文を実行する時、MySQLはスキャンする範囲を確定できないなら、InnoDBテーブルは同様に全テーブルをロックします。例えば、udate table set num=1 where name like「%aaa%」
二つのタイプの一番大きな違いは、Innodbは事務処理と外部キーと行レベルロックをサポートしています。MyISAMはサポートしていませんので、マイISAMは小さいプロジェクトでしか使えないと思われがちです。
MySQLを使用するユーザーの角度としては、InnodbとMyISAMが比較的に好きで、データベースプラットフォームが需要に達するならば:99.9%の安定性、便利な拡張性と高い利用可能性は、MyISAMが絶対に優先です。
理由は以下の通りです。
1、プラットフォームに積載されているほとんどの項目は読み書きが少ない項目で、MyISAMの読み取り性能はInnodbよりかなり強いです。
2、MyISAMのインデックスとデータは分離されており、インデックスは圧縮されており、メモリ使用率は対応してかなり向上しています。より多くのインデックスをロードすることができますが、Innodbはインデックスとデータが緊密に縛られています。圧縮を使用していないので、InnodbはMyISAMよりも大きな体積になります。
3、常に1、2ヶ月ぶりに、アプリケーション開発者がうっかりアップロードして表whereに書いた範囲が間違っていて、この表が正常に使えなくなりました。この時、MyISAMの優越性が現れました。適当にその日にコピーした圧縮カバンから対応表のファイルを取り出して、データベースディレクトリの下に勝手に置いて、dumpをsqlにしてからメインライブラリに戻します。対応するbinlogsを追加します。Innodbであれば、こんなに速いスピードはあり得ないかもしれません。Innodbは定期的にXxx.sqlのバックアップをエクスポートするように言われています。最小のデータベースインスタンスのデータ量はほとんど何十Gのサイズです。
4、接触の応用ロジックから言えば、select count(*)とorder byは最も頻繁で、sqlの全文の60%以上を占めています。このような操作はInnodbも実はロックされています。
5、また、多くのアプリケーション部門が定期的にいくつかのテーブルのデータを必要としています。MyISAMは便利です。彼らにそのテーブルに対応するfram.MYD、MYIのファイルを送って、彼ら自身を対応バージョンのデータベースで起動させてもいいです。Innodbはxx.sqlを導き出す必要があります。他の人にだけのファイルを与えるので、辞書データファイルの影響を受けます。相手は使えません。
6、MyISAM比insertと操作を書いたら、InnodbはまだMyISAMの書き込み性能に達していない。インデックスベースのudate操作なら、MyISAMは見劣りするかもしれないが、Innodbを高併記して書いて、ライブラリから追っかけるかどうかは問題であり、むしろ複数のインスタンスライブラリ分割テーブルアーキテクチャを通じて解決したい。
7、MyISAMを使うと、mergeエンジンはアプリケーション部門の開発速度を大幅に加速させることができます。彼らはこのmerge表に対してselect count(*)の操作をしさえすれば、大規模プロジェクトの総量は約数億のrowsのあるタイプ(ログ、調査統計など)の業務表にとても適しています。
もちろんInnodbも絶対使わないわけではありません。事務の項目でInnodbを使います。また、あなたのMyISAMは多すぎる書き込み操作には抵抗できないという人もいるかもしれませんが、アーキテクチャを通してカバーできます。

SELECT * FROM information_schema.key_column_usage WHERE table_name='  ' ;
show create table    ;
締め括りをつける
以上は小编でご绍介したMySQLが外部キーを作成できない原因と解决方法です。