質問
phpMyAdminを使用してデータベースをセットアップしています。 2つのテーブル(foo
とbar
)があり、プライマリキーにインデックスが付けられています。主キーを外部キーとして使用して、それらの間にリレーショナルテーブル(foo_bar
)を作成しようとしています。
これらのテーブルをMyISAMとして作成しましたが、MyISAMは外部キーをサポートしていないことを読んだため、3つすべてをInnoDBに変更しました。すべてのid
フィールドはINT(11)
です。
database.foo.id
テーブルを選択したら、<!> quot; relation view <!> quot;をクリックします。リンクし、FK列をdatabase.bar.id
および<=>に設定しようとすると、 <!> quot; No index defined!<!> quot; 各列の横に表示されます。
不足しているものは何ですか?
明確化/更新
簡単にするために、phpMyAdminを使い続けたいと思います。現在、XAMPPを使用しています。これは、PHP / CSS / Javascriptに集中できるほど簡単で、phpMyAdminに付属しています。
また、明示的な外部キーをまだ設定できていませんが、リレーショナルテーブルがあり、次のような結合を実行できます。
SELECT *
FROM foo
INNER JOIN foo_bar
ON foo.id = foo_bar.foo_id
INNER JOIN bar
ON foo_bar.bar_id = bar.id;
データベースでFKが明示的に定義されていないことは、私を不快にさせます。
解決
phpMyAdminを使用してリレーションを設定する場合、2つのことを行う必要があります。まず、参照元テーブルの外部キー列にインデックスを定義する必要があります(その場合はfoo_bar.foo_idです)。次に、リレーションビュー(参照元テーブル)に移動し、参照先列(つまり、foo.idの場合)と、更新時および削除時のアクションを選択します。
複数のテーブルが相互にリンクされている場合、外部キーは便利だと思います。特に、参照オプションを正しく設定すると、削除スクリプトが非常に短くなります。
編集:両方のテーブルでInnoDBエンジンが選択されていることを確認します。
他のヒント
phpMyAdminでは、<!> quot; relations <!> quot;を使用して外部キーを定義できます。ビュー。しかし、MySQLは<!> quot; INNO DB <!> quot;の外部制約のみをサポートしているため、テーブルの場合、最初のステップは、使用しているテーブルがそのタイプであることを確認することです。
CHILDという名前のテーブルのPID列がPARENTという名前のテーブルのID列を参照するように外部キーを設定するには、次のようにします。
- 両方のテーブルについて、操作タブに移動し、タイプを<!> quot; INNO DB <!> quot;に変更します
- IDがPARENTテーブルの主キー(または少なくともインデックス付きの列)であることを確認します。
- CHILDテーブルで、PID列のインデックスを定義します。
- CHILDテーブルの構造タブを表示しながら、<!> quot; relation view <!> quot;をクリックします。 <!> quot;フィールドの追加<!> quotのすぐ上のリンク。セクション。
- 各行がCLIENTテーブルのインデックス付き列に対応するテーブルが表示されます。各行の最初のドロップダウンでは、インデックス付き列が参照するTABLE-<!> gt; COLUMNを選択できます。 PIDの行で、ドロップダウンからPARENT-<!> gt; IDを選択し、GOをクリックします。
CHILDテーブルでエクスポートを実行すると、PID列に外部キー制約が作成されていることがわかります。
これはウィキペディアの記事の要約です。 PHPmyadminで規定できるさまざまなタイプの関係を指定します。 <!> quot; on update / delete <!> quot;の外部キーオプションの設定に関する@Nathanのコメントに関連するため、ここに配置します。しかし、コメントするには大きすぎます-役に立てば幸いです。
CASCADE
マスター(参照)テーブルの行が削除(または更新)されるたびに、一致する外部キー列を持つ子(参照)テーブルの各行も削除(または更新)されます。これはカスケード削除(またはupdate [2])と呼ばれます。
制限
参照されるテーブルの値を参照する外部キーテーブルに行が存在する場合、値を更新または削除することはできません。同様に、外部キーテーブルからの参照がある限り、行を削除することはできません。
アクションなし
NO ACTIONとRESTRICTは非常に似ています。 NO ACTIONとRESTRICTの主な違いは、NO ACTIONを使用すると、テーブルを変更しようとした後に参照整合性チェックが実行されることです。 RESTRICTは、UPDATEまたはDELETEステートメントを実行する前にチェックを行います。参照整合性チェックが失敗した場合、両方の参照アクションは同じように動作します。UPDATEまたはDELETEステートメントはエラーになります。
NULLを設定
参照行の外部キー値は、参照行が更新または削除されるとNULLに設定されます。これは、参照テーブルのそれぞれの列がNULL可能の場合にのみ可能です。 NULLのセマンティクスにより、外部キー列にNULLを含む参照行には参照行は必要ありません。
デフォルト設定
SET NULLと同様に、参照行の外部キー値は、参照行が更新または削除されるときに列のデフォルトに設定されます。
データベースを初めて使用する場合....既存のテーブルを変更する必要があります。多くのことが非常に簡単に思えますが、AとBの間には常に何かがあります。
他のものより先に、 this をご覧ください。
- P_ID(親テーブルと子テーブルの両方の親ID)があることを確認してください。
- もちろん、すでに親に入力されています。必ずしも最終的な方法で子供とは限りません。そのため、たとえばP_ID#3(子テーブルでは何度も親テーブルの元のP_IDを指しているでしょう)。
-
[SQL]タブに移動し(phpMyAdminを使用していますが、他のタブでも同様です)、次のコマンドを実行します。
ALTER TABLE child_table_name ADD FOREIGN KEY (P_ID) REFERENCES parent_table_name (P_ID)
-
最後にリレーショナルビューで、構造よりも子テーブルをクリックします。そこでDB計画を完了します。この前に、カスケード、制限などについていい答えがありました。 もちろん、コマンドで実行できます...
外部キーは、テーブルの非プライム属性が別のプライム属性を参照することを意味します * phpMyAdmin *で、最初に外部キーをインデックスとして設定する列を設定します
[関係ビュー]をクリックします
外部キーを設定するオプションがあります
InnoDBを使用すると、ALTER TABLEを使用して新しい外部キー制約をテーブルに追加できます。
ALTER TABLE tbl_name
ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
一方で、MyISAMがあなたのコンテキストでInnoDBより優れている場合、なぜ外部キー制約を作成したいのでしょうか。これは、アプリケーションのモデルレベルで処理できます。外部キーとして使用する列にインデックスが付けられていることを確認してください!
2つの列のデータ型が同じであることを忘れないでください。
たとえば、1つの列がINT型で、もう1つの列がtinyint型である場合、次のエラーが表示されます:
[PID列]での外部キーの作成エラー(データ型の確認)
ステップ1: 次の行を追加する必要があります。 default-storage-engine = InnoDB mysql構成ファイルの[mysqld]セクション(OSに応じてmy.cnfまたはmy.ini)の下で、mysqldサービスを再起動します。
ステップ2: テーブルを作成すると、テーブルのタイプがInnoDB
であることがわかります。ステップ3: 親テーブルと子テーブルの両方を作成します。ここで、子テーブルを開き、外部キーを持つように列Uを選択します。 以下に示すように、アクションラベルからインデックスキーを選択します。
ステップ4: 次に、下に示すように、印刷ビューの近くの下部から同じ子テーブルの関係ビューを開きます。
ステップ5: 列Uを選択し、ドロップダウンから親列を選択として外部キーを選択します。 dbName.TableName.ColumnName
httpsの公式MySQLドキュメントから://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :
MySQLは、外部キーと参照キーのインデックスを必要とするため、 外部キーのチェックは高速で、テーブルスキャンを必要としません。