MySQLのきほん「外部キー」

スポンサーリンク
MySQL

リレーショナルデータベースで、重要なのは、主キーと「外部キー」である。

主キーと外部キーとの対応関係でテーブル間のレコードを紐づけることができる。

この対応関係を保つための機能が「外部キー制約」である。

これによって、「外部キーを追加・更新するときに対応する主キーとが存在するか」や「主キーを削除するときに対応する外部キーが存在しないか」をデータベースがチェックしてくれる。

今回は、この「外部キー制約」を追加してみよう。

まずは、mysqlクライアントを起動しよう。

PS C:\Users\vinta> mysql -u root -p
Enter password: *****

続いて、basicデータベースに移動しよう。

mysql> USE basic;
Database changed

外部キーを設定しよう

scheduleテーブルのuidフィールド(外部キー)とusrテーブルのuidフィールド(主キー)に対して、外部キー制約を設定しよう。以下の通り、入力しよう。

mysql> ALTER TABLE schedule
    ->  ADD FOREIGN KEY (uid) REFERENCES usr (uid);

以下の通り「Query OK,・・」と表示されれば成功である。

mysql> ALTER TABLE schedule
    ->  ADD FOREIGN KEY (uid) REFERENCES usr (uid);
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

ここで、scheduleテーブルのフィールド情報を確認しよう。以下の通り、入力しよう。

mysql> SHOW FIELDS FROM schedule;

以下の通り、uidフィールド情のkey欄に「MUL」と表示されれば成功である。

mysql> SHOW FIELDS FROM schedule;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| pid     | int          | NO   | PRI | NULL    | auto_increment |
| uid     | varchar(7)   | YES  | MUL | NULL    |                |
| subject | varchar(100) | YES  |     | NULL    |                |
| pdate   | date         | YES  |     | NULL    |                |
| ptime   | time         | YES  |     | NULL    |                |
| cid     | int          | YES  |     | NULL    |                |
| memo    | text         | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
7 rows in set (0.02 sec)

レコードを追加しよう

scheduleテーブルにレコードを追加しよう。以下の通り、入力しよう。

mysql> INSERT INTO schedule (uid,subject,pdate,ptime,cid,memo)
    -> VALUES ('syamada','通院','2025-08-04','9:00',3,'午後から出社');

下記の通り、外部キー制約によりエラーメッセージ」が表示される。

mysql> INSERT INTO schedule (uid,subject,pdate,ptime,cid,memo)
    -> VALUES ('syamada','通院','2025-08-04','9:00',3,'午後から出社');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`basic`.`schedule`, CONSTRAINT `schedule_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `usr` (`uid`))

レコードを削除しよう

今度は、usrテーブルからレコードを削除しよう。下記の通り、入力しよう。

mysql> DELETE FROM usr WHERE uid = 'tyamada';

下記の通り、外部キー制約によりエラーメッセージ」が表示される。

mysql> DELETE FROM usr WHERE uid = 'tyamada';
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`basic`.`schedule`, CONSTRAINT `schedule_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `usr` (`uid`))

今回は、ここまでである。mysqlクライアントを終了しよう。

mysql> exit
Bye
PS C:\Users\vinta>

参考)3ステップでしっかり学ぶ MySQL入門 [改訂第3版]  山田奈美(著)山田祥寛(監修)技術評論社

コメント

タイトルとURLをコピーしました