IT企業未経験30代 100日後に自社のシステムを作れるようにする。⑪
今回は、前回で作成したテーブルから外部キーを使用した例を作成したいと思います。
外部キー制約について
外部キー制約とは、親テーブルと依存してる子テーブルがあるとします。
- usersテーブル(親テーブル)
- employee_attendancesテーブル(子テーブル)
親テーブルの(id)に対して子テーブルの(user_id)が不整合なデータを入れた場合エラーが出るように設定することが出来ます。
まず親テーブルの作成をしていきます。
CREATE TABLE users(
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL COMMENT '従業員名',
sex enum('male', 'female') default 'male' NOT NULL COMMENT '性別',
date_of_birth DATE COMMENT '誕生年月日',
date_of_employment DATE NOT NULL COMMENT '入社年月日',
PRIMARY KEY (id)
);
次に子テーブルの作成をしていきます。
CREATE TABLE employee_attendances(
id BIGINT NOT NULL AUTO_INCREMENT,
user_id BIGINT NOT NULL COMMENT '従業員ID',
check_in_datetime DATETIME NOT NULL COMMENT '出勤開始日時',
check_in_message VARCHAR(255) COMMENT 'LINE業務報告',
PRIMARY KEY (id),
FOREIGN KEY (user_id) REFERENCES users(id)
);
SHOW CREATE TABLE users;
次に整合性があるデータを入れていきます。
問題なくデータが入ることが確認できました。
INSERT INTO users(name, sex, date_of_birth, date_of_employment) VALUES('Tanaka Tarou', 'male', '2004-1-1', '2024-9-1');
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(1, '2024-09-04-07:30:00', 'NULL');
次に親テーブルに入っていない不整合な情報を入力してみます。
ちゃんと親テーブルの(id)に子テーブルで入力した情報は整合性が無いとエラーで注意されています。
INSERT INTO employee_attendances(user_id, check_in_datetime, check_in_message) VALUES(2, '2024-09-04-07:40:00', 'NULL');
注意点まとめ・余談
- テーブルを作成する前に親テーブルと子テーブルを親子関係を考える
- テーブル作成時に親と子の順番が逆になった場合は、存在しない値に外部キーとして登録することが出来ない
- 子テーブルの外部キーに値が登録されている親テーブルのレコードは削除できない
これはしっかりと親子関係の内容が把握できてなかったので起こったエラーになるのですが
初めに親テーブルをemployee_attendancesにしていたため、子テーブルを作成するときにエラーばかり出てそのエラーを調べても答えにたどり着くことが出来ませんでした。
色々なブログを参考にさせてもらっているのですが、まずは予期せぬエラーが出た場合は一度消して、自分が何をしたいか整理してから
MySQLの公式サイト見てもいいと思います。
下記にMySQLの公式URL貼っておきます。
https://dev.mysql.com/doc/refman/8.0/ja/create-table-foreign-keys.html
今回はMySQL編の内容はこれで終わります。
初学者としてMySQLの基礎を学びましたが、正直難しかったです。
ただ、調べてエラーが解決出来たり、知らないことを学べると楽しかったので、
学んだことをしっかりと業務に生かせるように頑張ります。
次回はPHP、Laravelについて学びたいと思います。
また次回よろしくお願いします。
~2024年10月1日~