リレーショナルデータベースで、重要なのは、主キーと「外部キー」である。
主キーと外部キーとの対応関係でテーブル間のレコードを紐づけることができる。
この対応関係を保つための機能が「外部キー制約」である。
これによって、「外部キーを追加・更新するときに対応する主キーとが存在するか」や「主キーを削除するときに対応する外部キーが存在しないか」をデータベースがチェックしてくれる。
今回は、この「外部キー制約」を追加してみよう。
まずは、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版] 山田奈美(著)山田祥寛(監修)技術評論社
コメント