web-dev-qa-db-ja.com

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

PhpMyAdminを使ってデータベースを設定しています。私は2つのテーブル(foobar)を持っています、 それらの主キーでインデックスされています 。主キーを外部キーとして使用して、それらの間にリレーショナルテーブル(foo_bar)を作成しようとしています。

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

foo_barテーブルを選択したら、 "relation view"リンクをクリックし、FK列をdatabase.foo.iddatabase.bar.idに設定しようとします。 "No index defined!"と表示されます。 各列の横にあります。

何が足りないの?

明確化/更新

簡単にするために、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が明示的に定義されていないのは、私を不快にするだけです。

313
Nathan Long

PhpMyAdminを使用して関係を設定したい場合は、2つのことをする必要があります。まず第一に、あなたは参照テーブルの外部キーカラムにインデックスを定義しなければなりません(だからあなたのケースではfoo_bar.foo_idです)。次に、(参照テーブル内の)リレーションビューに移動して、参照列(その場合はfoo.id)を選択し、on updateアクションとon deleteアクションを選択します。

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

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

341
rael_kid

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列に外部キー制約が作成されたことがわかります。

218
awais

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

_カスケード_

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

_制限_

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

何もしない

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

SET NULL

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

デフォルト設定

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

80
Brett

Phpmyadminでは、そのGUIだけで外部キーを割り当てることができます。テーブルをクリックして「構造」タブに進みます。ちょうど下の表のリレーションビューを見つけます(下の画像を参照)。

enter image description here

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

enter image description here

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

54
Nishad Up

データベースに新しいもの....そして既存のテーブルを変更する必要があります。多くのことがかなり簡単に思えますが、AとBの間には常に何かがあります。

何よりも先に、 this を見てください。

  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計画を完成させます。この前に、カスケード、制限などについていい答えがありました。もちろん、それはコマンドで実行できます。

14
user2060451

外部キーはテーブルの素数でない属性が別の素数属性を参照することを意味します * in 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よりもあなたのコンテキストで利点がある場合、なぜあなたは外部キー制約を全く作成したいのでしょうか。アプリケーションのモデルレベルでこれを処理できます。外部キーとして使用したいカラムがインデックスされていることを確認してください。

7
markus

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

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

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

4
pouya

ステップ1:mysql設定ファイルの[mysqld]セクションの下にdefault-storage-engine = InnoDBという行を追加し(OSによってmy.cnfまたはmy.ini)、mysqldサービスを再起動する必要があります。 enter image description here

ステップ2:テーブルを作成すると、テーブルの種類がわかります。InnoDB

enter image description here

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

enter image description here

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

enter image description here ステップ5:ドロップダウンから[親列を選択]のように外部キーを持つ列Uを選択します。 dbName.TableName.ColumnName

ON DELETEおよびON UPDATE /に適切な値を選択してください enter image description here

3
Vinod

https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html にある公式のMySQLドキュメントから。

MySQLは外部キーと参照キーのインデックスを必要とするので、外部キーのチェックは速くなり、テーブルスキャンを必要としません。

0
Jaime Montoya