「S3 開発/SQL - S3.1 SQLコマンド(UPDATE文)」からの出題です。
create table dept(id integer, name varchar);
create table emp(id integer, name varchar, dept_id integer, dept_name text);
ここで、dept表のname列をemp表のdept_name列にコピーするため、次のSQLを実行する。
update emp set dept_name = (select name from dept where id = emp.dept_id);
最も適切な説明を1つ選びなさい。
※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2023年4月26日
=> select * from dept;
id | name
----+----------------
1 | マリナーズ
2 | ヤンキース
2 | レッドソックス
(3 行)
もちろん、dept表のid列に一意制約があればこのようなことは発生しませんが、制約があることは必須ではなく、また重複があったとして、emp表にdept_id=2の行がなければ、SQLは成功します。なお、このようなテーブル構造の場合、外部キー(FOREIGN KEY)制約で、emp表のdept_id列からdept表のid列を参照させるのがよくある方法ですが、外部キー制約を使う場合は、参照される側、つまりdept表のid列に主キーまたは一意制約が必要です。
emp表のdept_idに一意制約があっても、このUPDATEの実行には関係ありませんが、現実的には、他のテーブルを参照する列に一意制約を付けることはないでしょうね。
なお、PostgreSQLの独自拡張で、UPDATEにFROM句を付けてテーブルの結合をすることができます。例題のUPDATE文とほぼ同等のことを
update emp set dept_name = dept.name from dept where emp.dept_id = dept.id
のように記述することもできますが、この場合、上のようにdept表にid=2の行が複数あってもエラーにならず、emp表のdept_id=2の行の更新結果は予測できないことに注意が必要です。
従って正解はCです。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.