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

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

2 つのテーブルを関連付けるときに、外部キーを作成できませんでした。このブログから、問題は、ポイント 6 の Charset および Collat​​e オプションのテーブル レベルとフィールド レベルの一貫性にあることがわかりました。 2 つのテーブルのエンコーディング文字セットと照合順序が一致していません。両方のテーブルで次の SQL ステートメントが実行されます。

テーブル名を変更し、文字セットを utf8 に変換します。

問題に対する完璧な解決策。

ps: MySQLは外部キーを作成できず、外部キーのプロパティをクエリできないことを確認しましょう

MyISAM と InnoDB の説明

InnoDB と MyISAM は、MySQL を使用する際に多くの人が最もよく使用する 2 つのテーブル タイプです。これらの 2 つのテーブル タイプには、特定のアプリケーションに応じて、それぞれ長所と短所があります。基本的な違いは、MyISAM タイプはトランザクション処理などの高度な処理をサポートしていないのに対し、InnoDB タイプはサポートしていることです。 MyISAM タイプのテーブルはパフォーマンスを重視しています。実行時間は InnoDB タイプよりも高速ですが、トランザクション サポートは提供されません。InnoDB はトランザクション サポートと、外部キーなどの高度なデータベース機能を提供します。

詳細と実装の違いは次のとおりです。

◆1. InnoDBはFULLTEXTタイプのインデックスをサポートしていません。

◆2. InnoDB はテーブル内の特定の行数を保存しません。つまり、select count(*) from table を実行すると、InnoDB はテーブル全体をスキャンして行数を計算する必要がありますが、MyISAM は保存された行数を単に読み取ります。 count(*) ステートメントに where 条件が含まれている場合、操作は両方のテーブルに対して同じになることに注意してください。

◆3. AUTO_INCREMENT 型のフィールドの場合、InnoDB にはこのフィールドのみを持つインデックスが含まれている必要がありますが、MyISAM テーブルでは他のフィールドとの結合インデックスを作成できます。

◆4. DELETE FROM table を実行すると、InnoDB はテーブルを再作成せず、行を 1 つずつ削除します。

◆5. LOAD TABLE FROM MASTER 操作は InnoDB では機能しません。解決策としては、まず InnoDB テーブルを MyISAM テーブルに変更し、データをインポートした後に InnoDB テーブルに戻すことです。ただし、これは追加の InnoDB 機能 (外部キーなど) を使用するテーブルには適用されません。

さらに、InnoDB テーブルの行ロックは絶対的ではありません。MySQL が SQL ステートメントの実行時にスキャンする範囲を決定できない場合、InnoDB テーブルはテーブル全体をロックします。たとえば、update table set num=1 where name like "%aaa%" などです。

2 つのタイプの主な違いは、Innodb がトランザクションと外部キーおよび行レベルのロックをサポートしていることです。 MyISAM はこれをサポートしていません。そのため、MyISAM は小規模なプロジェクトでの使用にのみ適していると考えられることが多いです。

MySQL ユーザーの観点からは、Innodb と MyISAM の両方が好まれます。データベース プラットフォームが 99.9% の安定性、便利なスケーラビリティ、高可用性の要件を満たす必要がある場合、MyISAM が間違いなく最初の選択肢です。

理由は次のとおりです。

1. プラットフォーム上で実行されるプロジェクトのほとんどは読み取りが多く書き込みが少ないプロジェクトであり、MyISAM の読み取りパフォーマンスは Innodb よりもはるかに優れています。

2. MyISAM はインデックスとデータが分離されており、インデックスが圧縮されているため、メモリ使用率が大幅に向上します。 Innodb はより多くのインデックスをロードできますが、Innodb のインデックスとデータは緊密にバンドルされており、圧縮は使用されていないため、Innodb は MyISAM よりもはるかに大きくなります。

3. 1~2 か月に 1 回、アプリケーション開発者が誤って範囲が間違っているテーブルを更新し、テーブルが使用できなくなることがよくあります。このとき、MyISAM の優位性が反映されます。その日にコピーした圧縮パッケージから該当するテーブルのファイルを取り出し、データベース ディレクトリに配置し、SQL にダンプしてメイン データベースにインポートし、該当する binlog に記入するだけです。 Innodb であれば、それほど高速にはならないと思います。最小のデータベース インスタンスのデータ量は基本的に数十 GB なので、Innodb で定期的に export xxx.sql メカニズムを使用してバックアップするように言わないでください。

4. アプリケーション ロジックの観点では、select count(*) と order by が最も頻繁に実行される操作で、SQL ステートメント全体の 60% 以上を占めています。Innodb は実際にこの操作のためにテーブルをロックします。Innodb は行レベルのロックであり、主キーに対してのみ有効であると考えている人が多いです。主キー以外のキーはテーブル全体をロックします。

5. また、定期的に特定のテーブルのデータを提供する必要があるアプリケーション部門が多数あります。MyISAM は非常に便利です。テーブルに対応する frm.MYD、MYI ファイルを送信し、対応するバージョンでデータベースを起動させるだけです。Innodb では、xxx.sql をエクスポートする必要があります。ファイルのみを他の人に渡すと、辞書データ ファイルの影響で相手が使用できなくなるためです。

6. 挿入書き込み操作で MyISAM と比較した場合、Innodb は MyISAM の書き込みパフォーマンスに到達できません。インデックスベースの更新操作の場合、MyISAM は Innodb より劣るかもしれませんが、スレーブ データベースがこのような高同時書き込みに対応できるかどうかも問題です。この問題は、マルチインスタンス シャーディング アーキテクチャを通じて解決する方がよいでしょう。

7. MyISAM を使用すると、マージ エンジンによってアプリケーション部門の開発速度が大幅に向上します。マージ テーブルでいくつかの select count(*) 操作を実行するだけで済みます。大規模プロジェクトで合計数億行程度の特定の種類のビジネス テーブル (ログ、調査統計など) に非常に適しています。

もちろん、Innodb が絶対に使用されないわけではありません。トランザクションを使用するプロジェクトでは、Innodb を使用する必要があります。さらに、MyISAM は書き込み操作が多すぎると耐えられないと言う人もいるかもしれませんが、これはアーキテクチャによって補うことができます。

SELECT * FROM information_schema.key_column_usage WHERE table_name='テーブル名';
show create table テーブル名;

要約する

以上が、MySQL が外部キーを作成できない原因と解決方法の紹介です。参考になれば幸いです。

以下もご興味があるかもしれません:
  • MySQL外部キーの基本的な機能と使用方法の詳細な説明
  • MySQL外部キーの3つの関係例の詳細な説明
  • MySQL データベースのデータ テーブルの最適化、外部キーの分析、3 つのパラダイムの使用
  • MySQL でデータ テーブルを作成し、主キーと外部キーの関係を確立する方法の詳細な説明
  • MySQL 外部キー制約の一般的な操作の例 [表示、追加、変更、削除]
  • 外部キー制約を持つテーブルデータを削除する MySQL メソッドの紹介
  • MySQL テーブルを削除するときに外部キー制約を無視するシンプルな実装
  • MySQL が外部キーエラーを追加します: 1215 外部キー制約ソリューションを追加できません
  • MySQL で外部キーを使用してカスケード削除と更新を実装する方法
  • MySQL テーブル作成外部キー エラーの解決方法

<<:  jsはポップアップウィンドウをクリックすることでポップアップログインボックスを実装します

>>:  Vue プロジェクトで Baidu Map API を使用する方法

推薦する

docker createコマンドの使用方法

docker create コマンドは、イメージに基づいてコンテナを作成できます。このコマンドの効果...

MySQLデータベースに他のIPアドレスからアクセスできない問題の解決策

序文先ほどのプロジェクトを参考にすると、環境は整いました。プロジェクトの準備と検証の段階で、問題が発...

Nginx を使用してクロスドメイン Vue 開発環境を処理する方法

1. 需要正しい Cookie 配信と SSO テストを確実に実行できるように、ローカル テスト ド...

HTMLテキストオーバーフローの2つの一般的な解決策は省略記号を表示することです

方法1: CSSオーバーフロー省略を使用して解決する解決策は次のとおりです。 CSSコード: ディス...

ES6 における Object.assign() の使い方の詳細な説明

目次2. 目的2.1 オブジェクトにプロパティを追加する2.3 オブジェクトの複製2.4 複数のオブ...

Tomcat をアンインストールして再インストールする方法 (画像とテキスト付き)

tomcat9をアンインストールする1. Tomcatのインストールはディレクトリに解凍するだけで...

Ubuntu 16.04/18.04 に Pycharm と Ipython をインストールするチュートリアル

Ubuntu 18.04の場合1. sudo apt install python 。コマンドライン...

CentOS7 は yum を使用して mysql 8.0.12 をインストールします

この記事では、centos7にyumを使用してMySQL 8.0.12をインストールする詳細な手順を...

MySQL マスターとスレーブの不整合とその解決策の詳細な説明

1. MySQL マスタースレーブ非同期1.1 ネットワーク遅延MySQLのマスタースレーブレプリケ...

Linux suse11でルートパスワードを忘れた場合に変更する方法の簡単な分析

SUSE Linuxでルートパスワードを忘れた場合の解決方法SUSE (Linux オペレーティング...

JS を使用してバイナリ ツリー トラバーサル アルゴリズムのサンプル コードを実装する

目次序文1. バイナリツリー1.1. 二分木の走査1.2. jsを使用してバイナリツリーを表現する1...

canvas.toDataURL image/png エラー処理方法の推奨

問題の背景:再生中のビデオのスクリーンショットを撮る必要があります。ビデオはビデオタグを使用して再生...

jQueryは検証コード送信のコントロールボタンを無効にする機能を実装します

必要な効果: 確認コードを送信するためにクリックした後、ボタンは無効になり、5 秒後に無効解除されま...

vue2 vue3 での Echarts の詳細な使用方法

目次1. インストール2. vue2でEchartsを使用するmain.jsファイル内コンテナが与え...

Linux環境でグラフデータベースneo4jを構築する方法の説明

Neo4j (Nosql の 1 つ) は、高性能なグラフ データベース (分散をサポートしていませ...