MySQLのForeign key(外部キー)についての整理およびPrimary Key、Unique Key との違いについて
どうも、ありあけこういちです。
MySQLにはいろんなキー制約があり、何を使えばよいか分からないことがありましたので、MySQLプライマリーキー、外部キー、ユニークキーどう使い分けるかまとめました。
Foreign key(外部キー)
-
外部キーとは、親テーブルと子テーブル間の関係データベースにおいてデータの整合性を保つための制約(参照整合性制約)であり、子テーブルに付与する。
-
テーブル間の関係性を設定する時に使用。
-
NULLを含めることが可能。
基本的な制約文は下記になります。
CONSTRAINT 外部キー名 FOREIGN KEY カラム名 REFERENCES 親テーブル名 (親テーブルのカラム名)
外部キー制約を削除する
ALTER TABLE テーブル名 DROP CONSTRAINT 外部キー名
親テーブルのレコードを削除する場合に外部キーで紐づいている子テーブルのレコードまで自動的に削除したい場合
ON DELETE CASCADE句を付けます。
CONSTRAINT 制約名 FOREIGN KEY カラム名 REFERENCES 親テーブル名 (親テーブルのカラム名) ON DELETE CASCADE
外部キー制約を一時的に無効化する
外部キー制約を適用しているテーブルにはDROP TABLEができないため、本番ではその挙動で良いものの、開発中にテーブルをまるごと作り直したい時などにこの制約が邪魔になることがあります。
その際に、外部キー制約を一時的に無効化するクエリです。
ALTER TABLE テーブル名 DISABLE CONSTRAINT 外部キー名
再度有効化する時は下記です。
ALTER TABLE テーブル名 ENABLE CONSTRAINT 外部キー名
外部キー制約を全体的に一時的に外すときは「0」を代入します。
SET foreign_key_checks = 0;
再び有効にするには「1」を代入します。
SET foreign_key_checks = 1;
一意(unique)とは?
Unique KeyとPrimary Keyの説明の前に、一意について軽くまとめてみますと、一意とは「重複しない」ことを意味します。
例として、a,b,c,dはそれぞれ重複しないので一意が取れていますが、a,a,b,cはaが重複しているので全体でみると一意とは言えません。
Unique Key
-
一意キー(UNIQUE 制約が設定されたカラムには重複した値を格納できない。)
-
一つのテーブルにいくつでも設定することが可能
-
Primary Keyと代表的な違い
-
複数のカラムに対して UNIQUE 制約を設定することができる。
-
-
UNIQUE 制約の場合は値として NULL を格納することができ、また複数のカラムに NULL を格納できる。
基本的な制約文(CREATE TABLEの場合)
CREATE TABLE テーブル名 (カラム名 データタイプ UNIQUE, ...)
Primary Key(主キー)
-
一意キー(重複を禁止)
-
必ず何かの値を持っている。(NOT NULL)
-
一つのテーブルに対し一つのみ作成。(Unique Keyと大きな違い。)
-
データの出席番号のようなイメージ
下記のリファレンスから抜粋
https://wa3.i-3-i.info/word1991.html
基本的な制約文(CREATE TABLEの場合)
CREATE TABLE テーブル名 (カラム名 データタイプ PRIMARY KEY, ...)
複数カラムの組み合わせに対してPrimary Key制約を設定する場合の制約文
CREATE TABLE テーブル名
(カラム名1 データタイプ1, カラム名2 データタイプ2, ...,
PRIMARY KEY(カラム名1, カラム名2, ...))
参考文献
- 公式ドキュメント FOREIGN KEY Constraints
https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html - 公式ドキュメント Partitioning Keys, Primary Keys, and Unique Keys
https://dev.mysql.com/doc/refman/8.0/en/partitioning-limitations-partitioning-keys-unique-keys.html - 一意とは
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典https://wa3.i-3-i.info/word12715.html - 外部キーとは?〜概要から変数や処理の書き方を解説〜
https://products.sint.co.jp/siob/blog/what-is-foreign-key - https://blog.katsubemakito.net/mysql/mysql-foreignkey-disable