phpMyAdminで外部キーを設定しますか?


335

phpMyAdminを使用してデータベースを設定しています。2つのテーブル(foobar)があり、それらの主キーにインデックスが付けられていますfoo_bar主キーを外部キーとして使用して、それらの間にリレーショナルテーブル()を作成しようとしています。

MyISAMとしてこれらのテーブルを作成しましたが、MyISAMが外部キーをサポートしていないことを読んだため、3つすべてをInnoDBに変更しました。すべてのidフィールドはINT(11)です。

foo_barテーブルを選択したら、[リレーションビュー]リンクをクリックして、FK列をに設定しようとするdatabase.foo.iddatabase.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がデータベースで明示的に定義されていないのは不快なだけです。

回答:


365

phpMyAdminを使用して関係を設定する場合は、2つのことを行う必要があります。まず、参照テーブルの外部キー列にインデックスを定義する必要があります(この場合はfoo_bar.foo_id)。次に、(参照テーブル内の)リレーションビューに移動し、参照された列(この場合はfoo.id)とon updateおよびon deleteアクションを選択します。

複数のテーブルが相互にリンクされている場合、外部キーは便利だと思います。特に、参照オプションを正しく設定すると、削除スクリプトが非常に短くなります。

編集:両方のテーブルでInnoDBエンジンが選択されていることを確認してください。


93
ヒント:リレーションビューはテーブルの下の小さなリンクです。そもそもそれを見つけるのは困難でした
Mladen Janjetovic

14
そのリンクがそこに表示されない場合を除き、その場合:これが起こらないようにするには、テーブルのタイプが(phpMyAdminの[操作]タブにある)InnoDBであることを確認してください。
muttley91 2014年

4
私のテーブルはInnoDBです。再確認しました。リンクはまだ表示されません。
afilina、2015

6
phpMyAdminの新しいバージョンで@afilinaは、それだけで、タブ行の下に、「構造」タブ内の上部に表示されている番組「ブラウズ」、「構造」などのその
Astitva Srivastavaの

225

phpMyAdminでは、「関係」ビューを使用して外部キーを定義できます。ただし、MySQLは「INNO DB」テーブルの外部制約しかサポートしていないため、最初のステップは、使用しているテーブルがそのタイプであることを確認することです。

CHILDという名前のテーブルのPID列がPARENTという名前のテーブルのID列を参照するように外部キーを設定するには、次のようにします。

  1. 両方のテーブルで、[操作]タブに移動し、タイプを「INNO DB」に変更します
  2. IDがPARENTテーブルの主キー(または少なくともインデックス付きの列)であることを確認してください。
  3. CHILDテーブルで、PID列のインデックスを定義します。
  4. CHILDテーブルの構造タブを表示しているときに、[フィールドの追加]セクションのすぐ上にある[リレーションビュー]リンクをクリックします。
  5. 各行がCLIENTテーブルのインデックス付きの列に対応するテーブルが表示されます。各行の最初のドロップダウンでは、インデックス付きの列が参照するTABLE-> COLUMNを選択できます。PIDの行で、ドロップダウンからPARENT-> IDを選択し、GOをクリックします。

CHILDテーブルでエクスポートを実行すると、PID列に外部キー制約が作成されていることがわかります。


2
うわー、知っておくべき非常に重要なこと。このページは、外部キーの追加に関するヘルプを探したときに最初に見つけたものではありませんでした。これがもっと頻繁に言及されていれば幸いです。
user1299656 2014年

86

これはウィキペディアの記事の要約です。PHPmyadminで規定できるさまざまなタイプの関係を指定します。ここでは、「更新/削除時」の外部キーオプションの設定に関する@Nathanのコメントに関連していますが、コメントには大きすぎます。

カスケード

マスター(参照)テーブルの行が削除(または更新)されるたびに、一致する外部キー列を持つ子(参照)テーブルのそれぞれの行も削除(または更新)されます。これはカスケード削除と呼ばれます(それぞれupdate [2])。

制限

参照されるテーブルの値を参照する外部キーテーブルに行が存在する場合、値を更新または削除することはできません。同様に、外部キーテーブルから行への参照がある限り、その行を削除することはできません。

何もしない

NO ACTIONとRESTRICTは非常に似ています。NO ACTIONとRESTRICTの主な違いは、NO ACTIONを使用すると、テーブルを変更しようとした後に参照整合性チェックが実行されることです。RESTRICTは、UPDATEまたはDELETEステートメントを実行する前にチェックを行います。参照整合性チェックが失敗した場合、両方の参照アクションは同じように動作します。UPDATEまたはDELETEステートメントはエラーになります。

NULLを設定

参照先の行が更新または削除されると、参照元の行の外部キー値はNULLに設定されます。これは、参照テーブルのそれぞれの列がNULL可能である場合にのみ可能です。NULLのセマンティクスのため、外部キー列にNULLを含む参照行は、参照される行を必要としません。

デフォルトに設定

SET NULLと同様に、参照行の外部キー値は、参照行が更新または削除されるときに列のデフォルトに設定されます。


1
さらに良いのは、MySQLソースドキュメントに直接アクセスすることです:dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
kmoser

62

phpmyadminでは、GUIだけで外部キーを割り当てることができます。テーブルをクリックして、[構造]タブに移動します。テーブルのすぐ下にあるリレーションビューを見つけます(下の画像を参照)。

ここに画像の説明を入力してください

鍛造キーは、主キーの近くにあるリストボックスから割り当てることができます(下の画像を参照)。と保存

ここに画像の説明を入力してください

対応するSQLクエリが自動的に生成および実行されます。


16

データベースを初めて使用する場合、既存のテーブルを変更する必要があります。多くのことはかなり単純明快に思われますが、AとBの間には常に何かがあります。

何よりもまず、これを見てください。

  1. P_ID(親テーブルと子テーブルの両方の親ID)があることを確認します。
  2. もちろん、それはすでに親で埋められます。必ずしも本当の最終的な方法で子供にあるわけではありません。したがって、たとえばP_ID#3(おそらく、子テーブルで何度も親テーブルの元のP_IDがポイントされます)。
  3. [SQL]タブに移動し(私はphpMyAdminを使用していますが、他のものと同様です)、次のコマンドを実行します。

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
  4. 構造ではなく子テーブルをクリックし、最後にリレーショナルビューをクリックします。そこでDB計画を完了します。これの前に、カスケード、制限などについて良い答えがありました。もちろん、コマンドで実行できます...


9

外部キーは、他の主要属性テーブルreferesの非プライム属性を意味 * phpMyAdminの中には、 *最初のあなたがインデックスとして外部キーを設定したい列を設定します

次にRELATION VIEWをクリックします

そこで、外部キーを設定するオプションを見つけることができます


7

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よりも優れている場合、なぜ外部キー制約を作成する必要があるのでしょうか。これは、アプリケーションのモデルレベルで処理できます。外部キーとして使用する列にインデックスが付けられていることを確認してください。


4
外部キー制約により、多くの労力と潜在的なエラーを節約できます。たとえば、システムからユーザーを削除するとします。そのユーザーに関するデータが存在するデータベース内のすべての場所を指定するコードを記述して、削除するように指示することができます。ただし、削除機能は常に最新の状態に保つ必要があります。一方、すべてのユーザー関連データにユーザーのIDへのFKがあり、削除時にカスケードするように設定されている場合、すべてのコードは「このユーザーを削除する」であり、データベースはすべてのデータを削除しますそのユーザーへのFK参照。維持するためにはるかにきれい。
Nathan Long

1
@ネイサン:それは私が投稿で言っていることです。モデルレベルでも処理できます。モデルからカスケードの削除を実装できます。
マーカス2009年

3
ほとんど常に、データベーステーブルに参照整合性を追加します。データベースは、不適切なアプリケーションプログラミングからデータベースを保護する必要があります。データの整合性を維持するために、アプリケーションだけに依存しないでください。もちろん、すべてのルールには常に例外がありますが、これについては例外を見つけていません。
Harv

4

2つの列のデータ型が同じであることを忘れないでください。

たとえば、一方の列のタイプがINTで、もう一方の列のタイプがtinyintの場合、次のエラーが発生します。

[PID列]で外部キーを作成中にエラーが発生しました(データ型を確認してください)


3

ステップ1:mysql configファイル(OSに応じてmy.cnfまたはmy.ini)の[mysqld]セクションの下にdefault-storage-engine = InnoDBの行を追加し、mysqldサービスを再起動する必要があります。 ここに画像の説明を入力してください

ステップ2:テーブルを作成すると、テーブルのタイプがInnoDBであることがわかります。

ここに画像の説明を入力してください

ステップ3:親テーブルと子テーブルの両方を作成します。次に、Childテーブルを開いて、外部キーを含める列Uを選択します。以下に示すように、アクションラベルからインデックスキーを選択します。

ここに画像の説明を入力してください

ステップ4:次に示すように、同じ子テーブルのリレーションビューを下から印刷ビュー近くに開きます。

ここに画像の説明を入力してください 手順5:ドロップダウンから[親を選択]列として外部キーを設定する列Uを選択します。dbName.TableName.ColumnName

ON DELETEおよびON UPDATEに適切な値を選択します ここに画像の説明を入力してください


2

最初にストレージエンジンをInnoDBとして設定します

最初にストレージエンジンをInnoDBとして設定します

次に、構造メニューでリレーションビューオプションを有効にします

次に、関係ビューオプションを有効にします。


最初のステップは正しいですが、次のステップについては、すべてのプロセスを段階的に記述してください。
kunal shaktawat

2

これは古いスレッドですが、答えは誰にとっても有用であるためです。

ステップ1。DBストレージエンジンがInnoDBに設定されている

ステップ2。プライマリテーブルを作成

これcustomerは主テーブルでcustomer_idあり、主キーです

ここに画像の説明を入力してください

ステップ3。外部キーテーブルを作成し、インデックスを与える

ここにはcustomer_addresses関連テーブルとして顧客の住所が格納されているので、ここcustomer_idではcustomerテーブルとの関係

以下のようにテーブルを作成するときにインデックスを直接選択できます

ここに画像の説明を入力してください

テーブルを作成するときにインデックスを指定するのを忘れた場合は、以下のようにテーブルの構造タブからインデックスを指定できます。

ここに画像の説明を入力してください

ステップ4。インデックスがフィールドに与えられたら、構造タブに移動し、以下の写真に示すように関係ビューをクリックします

ここに画像の説明を入力してください

ステップ5。今現在のテーブルからON DELETEとON UPDATEあなたが何をしたいのか、選択列を選択し、DB(SAME DB)を選択し、PICと以下のようにそのテーブルから関係テーブルと主キーを選択し保存し

ここに画像の説明を入力してください

次に、リレーションが成功したかどうかを確認し、外部テーブルデータリストに移動して外部キー値をクリックします。プライマリテーブルレコードにリダイレクトすると、リレーションが正常に作成されます。



0

phpMyAdminの新しいバージョンには、「Relation View」オプションがなくなりました。この場合、同じことを行うにはステートメントを実行する必要があります。例えば

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

この例では、companysの行が削除されると、そのcompanyidを持つすべての従業員も削除されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.