次に、以下のレコードを挿入しましょう。

外部キー制約があってもレコードを挿入するINSERT INTO構文には変化はありません。
ただし、参照する側のレコードよりも先に参照される側のレコードを挿入しなければなりません。
今回の例の場合は、
【subject_list】が【teacher_list】を参照しているので、
【subject_list】よりも先に【teacher_list】にデータを挿入
【registration_list】が【student_list】および【subject_list】を参照しているので、
【registration_list】よりも先に【student_list】および【subject_list】にデータを挿入
しなければなりません。
よって、レコード挿入は、
1.【student_list】および【teacher_list】(この2つではどちらが先でも良い)
2.【subject_list】
3.【registration_liar】
の順に行う必要があります。
また、挿入の順番を守っても、カラムの値を間違えるなどして参照先に存在しない値のレコードを挿入しようとすると、
Cannot add or update a child row: a foreign key constraint fails
というエラーが発生します。
以下はSQLの例です。
INSERT INTO student_list(student_id, student_name)
VALUES('1001', '鈴木'),
('1002', '佐藤'),
('1003', '田中'),
('1004', '高橋');
INSERT INTO teacher_list(teacher_id, teacher_name, ex_number)
VALUES('T01', '沖田', '0013'),
('T03', '山南', '0036');
INSERT INTO subject_list(subject_id, subject_name, teacher_id)
VALUES('A01', 'データベース演習', 'T01'),
('B01', 'MOS対策', 'T01'),
('C01', 'Webデザイン概論', 'T03');
INSERT INTO registration_list(student_id, subject_id)
VALUES('1001', 'A01'),
('1001', 'B01'),
('1002', 'A01'),
('1002', 'B01'),
('1003', 'B01'),
('1003', 'C01'),
('1004', 'A01'),
('1004', 'C01');練習問題
(1)以下のテーブルを作成するSQLを記述しなさい。
※順番にも注意!
【会員台帳】
テーブル名:member_list
| 項目 | 列名 | 型 | 誓約 |
|---|---|---|---|
| 会員ID | member_id | CHAR(2) | 主キー |
| 氏名 | member_name | VARCHAR(15) | |
| 住所 | member_address | VARCHAR(100) |
【商品台帳】
テーブル名:item_list
| 項目 | 列名 | 型 | 誓約 |
|---|---|---|---|
| 商品ID | item_id | CHAR(2) | 主キー |
| 商品名 | item_name | VARCHAR(20) | |
| 単価 | price | INT |
【売り上げ伝票】
テーブル名:sales
| 項目 | 列名 | 型 | 誓約 |
|---|---|---|---|
| 売上ID | sales_id | INT | 主キー |
| 会員ID | member_id | char(2) | member_list の member_id を参照する外部キー |
【売上明細】
テーブル名:sales_detail
| 項目 | 列名 | 型 | 誓約 |
|---|---|---|---|
| 売上ID | sales_id | INT | 主キー sales の sales_id を参照する外部キー |
| 商品ID | item_id | CHAR(2) | 主キー item_list の item_id を参照する外部キー |
| 個数 | item_count | INT |
(2)各テーブルに以下のレコードを挿入しなさい。
※順番に注意!

(3)以下のレコードを挿入してみましょう
参照先が存在しないレコード
例えば

というレコードを挿入してみましょう。
参照されているレコード
たとえば【item_list】からitem_id=’S1’のレコードを削除してみましょう。
それぞれ結果はどうなるか確かめましょう。

コメント