phpMyAdminを使ってデータベースを設定しています。 2つのテーブルがあります(foo
そしてbar
、主キーで索引付けされている。リレーショナルテーブルを作成しようとしています(foo_bar
それらの間で、外部キーとして主キーを使用します。
私はこれらのテーブルをMyISAMとして作成しましたが、MyISAMは外部キーをサポートしていないと読んだので、3つすべてをInnoDBに変更しました。すべてid
フィールドはINT(11)
。
私が選ぶときfoo_bar
テーブルを開き、 "relation view"リンクをクリックして、FK列をdatabase.foo.id
そしてdatabase.bar.id
、それは言う「インデックスは定義されていません。」各列の横にあります。
何が足りないの?
簡単にするために、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)とon updateおよびdeleteアクションを選択します。
複数のテーブルをリンクしている場合、特に参照オプションを正しく設定すると削除スクリプトが非常に短くなるので、外部キーは便利だと思います。
編集:両方のテーブルでInnoDBエンジンが選択されていることを確認してください。
phpMyAdminでは、「リレーション」ビューを使って外部キーを定義できます。しかし、MySQLは "INNO DB"テーブルに対する外部制約のみをサポートしているので、最初のステップはあなたが使用しているテーブルがそのタイプであることを確認することです。
CHILDという名前のテーブルのPID列がPARENTという名前のテーブルのID列を参照するように外部キーを設定するには、次のようにします。
CHILDテーブルでエクスポートを実行すると、PID列に外部キー制約が作成されたことがわかります。
これはウィキペディアの記事の要約です。 PHPmyadminで規定できるさまざまな種類の関係を指定します。それは「更新時/削除時」の外部キーオプションの設定に関する@ Nathanのコメントには関係がありますがコメントには大きすぎるので、ここに入れています。
カスケード
マスター(参照)テーブルの行が削除(または更新)されるたびに、一致する外部キーカラムを持つ子(参照)テーブルの各行も削除(または更新)されます。これはカスケード削除と呼ばれます(それぞれupdate [2])。
制限
被参照表の値を参照する外部キー表に行が存在する場合、値を更新または削除することはできません。同様に、外部キーテーブルからその行への参照がある限り、その行を削除することはできません。
何もしない
行動も制限も非常によく似ていません。 NO ACTIONとRESTRICTの主な違いは、NO ACTIONでは、テーブルを変更しようとした後に参照整合性チェックが行われることです。 RESTRICTは、UPDATEまたはDELETEステートメントを実行しようとする前にチェックを行います。参照整合性チェックが失敗した場合、両方の参照アクションは同じように機能します。UPDATEまたはDELETEステートメントはエラーになります。
SET NULL
参照行が更新または削除されると、参照行の外部キー値はNULLに設定されます。これは、参照テーブル内のそれぞれの列がNULL可能の場合にのみ可能です。 NULLのセマンティクスのため、外部キーカラムにNULLを含む参照行は参照行を必要としません。
デフォルト設定
SET NULLと同様に、参照行が更新または削除されると、参照行の外部キー値は列のデフォルトに設定されます。
データベースに新しいもの....そして既存のテーブルを変更する必要があります。多くのことはかなり簡単なようですが、AとBの間には常に何かがあります。
何よりも先にこの。
[SQL]タブに移動し(私はphpMyAdminを使用しています。他のものも同様であるはずです)、次のコマンドを実行します。
ALTER TABLE child_table_name
外部キーを追加(P_ID)
参照parent_table_name(P_ID)
構造よりも子テーブルをクリックし、最後にリレーショナルビューをクリックします。そこでDB計画を完成させます。この前に、カスケード、制限などについて良い答えがありました。 もちろんそれはコマンドで実行できます。
外部キーとは、テーブルの素数以外の属性が別の素数属性を参照していることを意味します。*phpMyAdminで*最初にインデックスとして外部キーを設定したいカラムを設定します
それからRELATION VIEWをクリックしてください
外部キーを設定するためのオプションがあります。
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つの列が同じデータ型を持つべきであることを忘れないでください。
たとえば、一方の列がINT型で、もう一方の列が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
での公式のMySQLドキュメントからhttps://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html:
MySQLは外部キーと参照キーのインデックスを必要とします。 外部キーチェックは高速で、テーブルスキャンを必要としません。