294

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

10 답변


324

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

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

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


  • ヒント:Relationsビューはあなたのテーブルの下にある小さなリンクです。そもそもそれを見つけるのは大変でした。 - Mladen Janjetovic
  • そのリンクがそこに表示されないのでない限り、その場合:これが起こらないようにするためにあなたのテーブルがタイプInnoDB(phpMyAdminのオペレーションタブの下にある)であることを確認してください。 - muttley91
  • @ muttley91MyテーブルはInnoDBです。ダブルチェックしました。リンクはまだ表示されません。 - afilina
  • そこにあります - imgur.com/gw80CWC - shershen
  • @afilina新しいバージョンのphpMyAdminでは、上部の"構造"に表示されています。 < Browse"" Structure>などを示すタブ行のすぐ下のタブ - Astitva Srivastava

210

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


  • うわー、知っておくべき非常に重要なこと。このページは、外部キーを追加する際の助けを探すときに私が最初に見つけたものではありませんでした。 - user1299656

75

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

カスケード

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

制限

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

何もしない

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

SET NULL

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

デフォルト設定

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



50

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

enter image description here

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

enter image description here

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


12

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

何よりも先にこの

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

    ALTER TABLE child_table_name

    外部キーを追加(P_ID)

    参照parent_table_name(P_ID)

  4. 構造よりも子テーブルをクリックし、最後にリレーショナルビューをクリックします。そこでDB計画を完成させます。この前に、カスケード、制限などについて良い答えがありました。 もちろんそれはコマンドで実行できます。


9

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


  • 外部キー制約は私に多くの労力と潜在的なエラーを救います。たとえば、自分のシステムからユーザーを削除しようとしているとします。そのユーザーに関するデータが存在するデータベース内のすべての場所を指定し、それを削除するように指示するコードを書くことができます。しかし、私はその削除機能を常に最新の状態に保つ必要があります。一方、すべてのユーザー関連データにユーザーIDのFKがあり、削除時にカスケードするように設定されている場合、私のコードでは「このユーザーを削除する」としなければなりません。データベースは、そのユーザーへのFK参照を持つものすべてを削除します。維持するためにはるかにきれい。 - Nathan Long
  • @Nathan:それは私が投稿で言っていることです。モデルレベルでもそれを扱うことができます。モデルからカスケード削除を実装できます。 - markus
  • ほとんどの場合、データベーステーブルに参照整合性を追加します。データベースは悪いアプリケーションプログラミングから自分自身を守るべきです。データの完全性を維持するためにアプリケーションだけに頼らないでください。もちろん、すべての規則には常に例外がありますが、そのための規則はありません。 - Harv

4

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

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

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


2

ステップ1: 次の行を追加する必要があります。 default-storage-engine = InnoDB mysql設定ファイルの[mysqld]セクション(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


0

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

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

リンクされた質問


関連する質問

最近の質問