MySQL サーバ 3.23.44
以降では、CASCADE
、ON
DELETE
、および ON UPDATE
を含む外部キー制約のチェックが
InnoDB
テーブルでサポートされています。 See
項7.5.5.2. 「FOREIGN KEY
制約」。
他のテーブル型については、MySQL
サーバでは現在、CREATE TABLE
コマンドで FOREIGN KEY
構文のみが解析されますが、この情報は使用/保存されません。近いうちに、この情報がテーブル仕様ファイルに保存され、mysqldump
および ODBC
によって取得できるように、この実装を拡張する予定です。さらにその後には、MyISAM
テーブルについても外部キー制約を実装する予定です。
SQL
の外部キーはテーブルの結合に使用されるのではなく、参照整合性(外部キー制約)のチェックと確保に使用されます。SELECT
ステートメントを使用して複数のテーブルから結果を得るには、次のようにテーブルを結合します。
SELECT * FROM table1,table2 WHERE table1.id = table2.id;
See 項6.4.1.1. 「JOIN
構文」。 See
項3.6.6. 「外部キーの使用」。
制約として使用する際、アプリケーションによって
MyISAM
テーブルに適切な順序でレコードが挿入される場合は、外部キーを使用する必要はありません。
MyISAM
テーブルについては、ON DELETE
が実装されていないという問題に対処するには、外部キーがあるテーブルからレコードを削除する際に適切な
DELETE
ステートメントをアプリケーションに追加します。実際、この方法は外部キーを使用する場合と同じくらい簡単で(場合によっては、この方が簡単です)、移植性はそれよりもはるかに高くなります。
MySQL サーバ 4.0
では、複数テーブルの削除を使用して、1
つのコマンドで多数のテーブルからレコードを削除することができます。
See 項6.4.5. 「DELETE
構文」。
ON DELETE ...
を含まない
FOREIGN KEY
構文は多くの場合、自動 WHERE
節を生成する ODBC
アプリケーションによって使用されます。
外部キーを誤って使用すると、深刻な問題が発生することがあるので注意してください。適切に使用した場合でも、外部キーのサポートは、参照整合性の問題を解決する上で役に立つことはあっても、重要な解決策にはなりません。
外部キーを使用するメリットは、以下のとおりです。
関係が適切に設計されている場合、外部キー制約によって、プログラマがデータベースで不整合を引き起こすことが少なくなる。
連鎖更新および削除を使用すると、クライアントコードを単純化することができる。
適切に設計された外部キールールは、テーブル間の関係の記述に役立つ。
外部キーを使用するデメリットは、以下のとおりです。
キー関係を設計する上で犯しやすい間違いによって、循環ルール、連鎖削除の不適切な組み合わせなどの深刻な問題が生じることがある。
データベースレベルでの余分なチェックによって、パフォーマンスに影響が生じる。そのため、一部の主要な商用アプリケーションでは、アプリケーションレベルでこのロジックがコード化されている。
DBA にとって、個々のテーブルのバックアップやリストアが非常に困難になり、場合によっては不可能になるような複雑な関係のトポロジを作成することはめったにない。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.