複数のテーブルにレコードを挿入する

データベース

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

外部キー制約があってもレコードを挿入する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の例です。

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

項目列名誓約
会員IDmember_idCHAR(2)主キー
氏名member_nameVARCHAR(15)
住所member_addressVARCHAR(100)

【商品台帳】
テーブル名:item_list

項目列名誓約
商品IDitem_idCHAR(2)主キー
商品名item_nameVARCHAR(20)
単価priceINT

【売り上げ伝票】
テーブル名:sales

項目列名誓約
売上IDsales_idINT主キー
会員IDmember_idchar(2)member_list の member_id を参照する外部キー

【売上明細】
テーブル名:sales_detail

項目列名誓約
売上IDsales_idINT主キー
sales の sales_id を参照する外部キー
商品IDitem_idCHAR(2)主キー
item_list の item_id を参照する外部キー
個数item_countINT

(2)各テーブルに以下のレコードを挿入しなさい。

※順番に注意!

(3)以下のレコードを挿入してみましょう

参照先が存在しないレコード

例えば

というレコードを挿入してみましょう。

参照されているレコード

たとえば【item_list】からitem_id=’S1’のレコードを削除してみましょう。

それぞれ結果はどうなるか確かめましょう。

コメント

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