今回は、Silverの「S3 開発/SQL - S3.1 SQL コマンド(テーブル定義)」からの出題です。
※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2011年11月30日
テーブルには、列の値の一意性などの制約をつけることができます。
制約は、CREATE TABLE 文でテーブルを定義するときに設定することも、ALTER TABLE 文で後から設定することもできます。
本問の例では、CREATE TABLE 文によるテーブル定義時に id 列に関するUNIQUE(一意性)の制約と、val 列に関する val>=0 のチェック制約を設定しています。
従って、id 列の値が重複してしまうような SQL 文、および val 列の値が負になってしまうような SQL 文はエラーになります。
name 列については制約がありませんから、名前が重複したり、あるいは NULLであっても、エラーにはなりません。
CREATE TABLEに続き、id の値が 1 の行、2 の行の2行を挿入しています。
続いて実行される、選択肢の SQL 文ですが、
A は id の -1、val の 100 はいずれも制約に違反していませんからエラーにはなりません。
B は val の -100 が val>=0 という制約に違反するのでエラーとなります。
C は id が 2 の行の id を 1 に変更しようとしていますが、id=1 の行が既に存在しているため、一意性制約の違反で、やはりエラーとなります。
D は id が 3 の行を削除しようとしています。B がエラーとなったため、削除対象となる行は存在しません。つまり DELETE 文が実行されたにも関わらず行が削除されませんが、それ自体はエラーではありません。
E は id が 3、val が 30 の行を挿入しようとしています。この時点で id が 3の行は存在していませんから、制約には違反しません。name 列の値を指定していませんが、テーブル定義でデフォルト値を指定していないので、name は NULLになります。name 列には制約がないのでエラーにはなりません。
従って、エラーになるのは B と C です。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.