データベースの基礎
顧客表(顧客ID, 氏名)の主キーは顧客IDで、注文表(注文ID, 顧客ID)の顧客IDは、顧客表の顧客IDを参照する外部キーとして定義されている。顧客表には顧客IDが'C1'と'C2'の行だけがある。この状態で INSERT INTO 注文 VALUES ('O9', 'C5') を実行したときの結果として正しいものはどれか。
- A参照整合性制約に違反するので、行は追加されずエラーになる
- B行が追加され、顧客表にも顧客IDが'C5'の行が自動で追加される
- C行は追加されるが、顧客IDの値はNULLに置き換えられる
答えと解説を見る
正解:A. 参照整合性制約に違反するので、行は追加されずエラーになる
外部キーは、ほかの表(ここでは顧客表)の主キーなどを参照する列で、参照先に存在する値かNULLしか入れられないという参照整合性制約を守らせます。顧客表に'C5'という顧客はいないので、存在しない顧客の注文を追加しようとする操作はDBMSに拒否され、エラーになります。これにより、どの顧客のものかわからない注文が残ることを防げます。逆に、注文が残っている顧客の行を顧客表から削除しようとした場合も、既定の動作(NO ACTION)では拒否されます。外部キーの定義に ON DELETE CASCADE を付けると、顧客を削除したときに、その顧客の注文も連鎖して削除されるようにできます。
- A. 正しい。存在しない顧客IDを参照する行は、参照整合性制約によって拒否されます。
- B. DBMSは参照先の行を自動では作りません。
- C. 外部キーの値を勝手にNULLに置き換えることはなく、操作はエラーになります。