平成27年度 春期 午前 問28
データベース
検査制約の違反となるSQL文
“学生”表が次の SQL 文で定義されているとき,検査制約の違反となる SQL 文はどれか。
CREATE TABLE 学生 ( 学生番号 CHAR(5) PRIMARY KEY,
学生名 CHAR(16),
学部コード CHAR(4),
住所 CHAR(16),
CHECK (学生番号 LIKE 'K%'))
学生
| 学生番号 | 学生名 | 学部コード | 住所 |
|---|---|---|---|
| K1001 | 田中太郎 | E001 | 東京都 |
| K1002 | 佐藤一美 | E001 | 茨城県 |
| K1003 | 高橋肇 | L005 | 神奈川県 |
| K2001 | 伊藤香織 | K007 | 埼玉県 |
- アDELETE FROM 学生 WHERE 学生番号 = 'K1002'
- イINSERT INTO 学生 VALUES ('J2002','渡辺次郎','M006','東京都')
- ウSELECT * FROM 学生 WHERE 学生番号 = 'K1001'
- エUPDATE 学生 SET 学部コード = 'N001' WHERE 学生番号 LIKE 'K%'
答えと解説を見る
✓ これが正解イINSERT INTO 学生 VALUES ('J2002','渡辺次郎','M006','東京都')
解説
学生番号にKで始まらない値を入れる文が違反です。
設問は、定義された検査制約に違反するSQL文を選ばせています。定義文の末尾に置かれた検査制約は、学生番号がKで始まることを求めています。見張っているのはこの列だけですから、仕分ける線は二本です。まず、その文が学生番号に値を書き込むものかどうか。次に、書き込もうとしているその値がKで始まるかどうかです。四つのうち学生番号に値を書き込むのは一つだけで、新しい行を挿入してJ2002という値を入れようとする文がそれにあたります。先頭の1文字はJですから、Kで始まるという条件を満たさず、これが違反になります。あわせて、この値が主キーの重複にあたらないことも見ておきます。表にある四つの学生番号のどれとも一致しないので、落ちる理由は検査制約だけです。設問が検査制約と限って述べているのは、この取り違えを避けるためです。制約を問う問題は、まず値が入る文かどうかで仕分けると速く決まります。
ほかの選択肢はなぜ違うのか
- アDELETE FROM 学生 WHERE…:行を消す文なので、新しい値は一つも入りません。指定された行が消えても、表に残る行はどれも先頭がKのままですから、列に入る値を見張る仕組みが働く場面がそもそもありません。
- ウSELECT * FROM 学生 WHE…:読み出すだけの文で、表の中身は1文字も変わりません。値が入らない以上、書き込む値を見張る仕組みとは関わりがなく、四つのうち最も早く外せる記述になります。
- エUPDATE 学生 SET 学部コード …:書き換えるのは学部コードの列で、学生番号には触れません。どの行を選ぶかを決める条件の側に先頭がKという書き方が現れるので紛らわしいのですが、それは書き込む値ではありません。
出典:平成27年度 春期 応用情報技術者試験 午前 問28
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)