今回は、Silverの「S3 開発/SQL - S3.1 SQL コマンド(テーブル定義)」からの出題です。
※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2012年1月11日
テーブルには、そのデータが満たすべき条件を制約として定義することができます。
この例題の sample テーブルでは、id 列に PRIMARY KEY、val1 列に NOT NULL、val2 列に UNIQUE という制約が付与されています。
NOT NULL は、その列の値が NULL であってはならない、という制約です。
UNIQUE は、その列の値が一意である、つまりその列の値が同じであるような行は他に存在しない、という制約です。ただし、NULL 値だけは例外で、UNIQUE 制約のある列の値が NULL である行が複数あっても、制約違反にはなりません。
PRIMARY KEY は主キーと呼ばれ、制約としては NOT NULL と UNIQUE の両方を合わせた条件となります。
これらの制約は、INSERT 文によるデータの追加時、UPDATE 文によるデータの更新時のいずれにも適用されます。
また、INSERT 文でデータの値を指定しなかった場合のデフォルト値を DEFAULT として指定することができます。sample テーブルでは、val2 列に DEFAULT 句が定義されており、INSERT 文で val2 の値を指定しなければ、'abc' に設定されます。
例題の選択肢を順に見ていきましょう。
A は val1 に NULL を指定していますが、これは NOT NULL 制約に違反します。
val1 列には DEFAULT が指定されていますが、これは値を指定しなかった場合にのみ適用され、この例のように NULL を指定した場合は当てはまりません。
従ってエラーとなります。
B は id 列にのみ値を指定しています。val1 にはデフォルト値の 'abc' が入ります。val2 には NULL が入ります。val2 が NULL の行が既に存在しますが、NULL の行が複数あっても UNIQUE 制約の違反とはならないので、エラーにはなりません。
C は val2 列にのみ値を指定しています。このため id には NULL が入りますが、これは PRIMARY KEY 制約に違反するため、エラーとなります。
D は id=1 の行の val2 を 'zzz' に変更しようとしていますが、val2 が 'zzz' の行が既に存在するため、これは UNIQUE 制約に違反し、エラーとなります。
E は id=2 の行の val1 を 'ccc' に変更しようとしています。val1 列の制約は NOT NULL だけですので、これは問題ありません。
従って、正解は A, C, D です。
制約には、本問で紹介したもののほかに、CHECK制約、外部キー制約があります。合わせて理解しておきましょう。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.