348

phpMyAdmin を使用してデータベースをセットアップしています。私は 2 つのテーブル (fooおよびbar)を持っており、それらの主キーでインデックスが作成されています。foo_bar主キーを外部キーとして使用して、それらの間にリレーショナル テーブル ( ) を作成しようとしています。

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

テーブルを選択したら、「リレーション ビュー」リンクをクリックし、FK 列をandfoo_barに設定しようとすると、「インデックスが定義されていません!」と表示されます。各列の横。database.foo.iddatabase.bar.id

私は何が欠けていますか?

明確化/更新

簡単にするために、phpMyAdmin を使い続けたいと思います。私は現在、PHP/CSS/Javascript に集中できるほど簡単な XAMPP を使用しています。これには 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 が明示的に定義されていないのは不快です。

4

14 に答える 14

378

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

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

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

于 2009-09-25T22:29:44.917 に答える
231

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

于 2011-06-05T18:22:50.467 に答える
92

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

カスケード

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

制限

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

何もしない

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

ヌルを設定

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

デフォルト設定

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

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

于 2009-01-21T09:07:57.327 に答える
4

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

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

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

于 2011-12-14T18:08:42.897 に答える