phpMyAdminを使ってデータベースを構築しています。2つのテーブル(foo
とbar
)があり、主キーでインデックスが付けられています。2つのテーブルの間に、主キーを外部キーとするリレーショナルテーブル(foo_bar
)を作成しようとしています。
これらのテーブルはMyISAMで作成しましたが、MyISAMでは外部キーをサポートしていないという記事を読んだので、3つともInnoDBに変更しました。すべての id
フィールドは INT(11)
です。
foo_barテーブルを選択して、"relation View"リンクをクリックし、FKカラムを
database.foo.idと
database.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がデータベースに明示的に定義されていないと不安なのです。
phpMyAdminを使ってリレーションを設定したい場合、2つのことをしなければなりません。まず、参照先のテーブルの外部キーカラムにインデックスを定義します (あなたの場合は foo_bar.foo_id)。次に、(参照テーブルの)リレーションビューに行き、参照されるカラム(あなたの場合は foo.id)を選択し、on update と on delete のアクションを実行します。
外部キーは、複数のテーブルがリンクしている場合に便利だと思います。特に、参照オプションを正しく設定すると、削除スクリプトが非常に短くなります。
EDIT: 両方のテーブルで InnoDB エンジンが選択されていることを確認してください。
phpMyAdminでは、"relations"ビューを使って外部キーを定義することができます。しかし、MySQLは外部制約を"INNO DB"テーブルでしかサポートしていないので、最初のステップは使用しているテーブルがそのタイプのものであることを確認することです。
CHILDというテーブルのPIDカラムがPARENTというテーブルのIDカラムを参照するように外部キーを設定するには、次のようにします。
1.両方のテーブルについて、操作タブを開き、テーブルのタイプを"INNO DB"に変更します。 2.IDがPARENTテーブルの主キー(または少なくともインデックス付きの列)であることを確認します。 3.CHILDテーブルで、PIDカラムにインデックスを定義します。 4.CHILDテーブルの構造タブを見ながら、"add fields"セクションのすぐ上にある"relationship view"リンクをクリックします。 5.5. 各行がCLIENTテーブルのインデックス付きの列に対応するテーブルが表示されます。各行の最初のドロップダウンでは、インデックス付きの列が参照するTABLE->COLUMNを選択できます。PIDの行では、ドロップダウンからPARENT->IDを選択し、GOをクリックします。
CHILDテーブルのエクスポートを行うと、PID列に外部キー制約が作成されていることが確認できます。
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よりも優れている場合、なぜ外部キー制約を作成する必要があるのでしょうか。これは、アプリケーションのモデルレベルで処理できます。ただ、外部キーとして使用したいカラムがインデックス付きであることを確認してください。