【データベースの知識】データベース運用で知っておくべき「更新可能なView」の8つの必須条件
SQLにおいて、複雑なクエリをカプセル化して擬似的なテーブルのように扱える「ビュー(View)」。
ビューは通常、データの参照(SELECT)に用いられるが、特定の条件をクリアしていれば、ビューに対して直接 INSERT、UPDATE、DELETE などの更新処理(DML)を行うことができる。
今回は、データベース設計や情報処理試験でも極めて重要となる、標準SQLにおける「更新可能なビュー」が満たすべき8つの厳格な条件を整理した。
1. 更新可能なビュー(Updatable View)の8大条件
DBMSがビューの向こう側にある実テーブル(基底テーブル)に対して、どのレコードのどの列を書き換えるべきかを一意に特定(マッピング)できる必要があるため、以下の条件が定められている。
- ① 1つだけのテーブルから作られていること
複数のテーブルを結合(JOIN)して作成されたビューは、原則として標準SQLでは直接更新できない。対象となる基底テーブルが単一である必要がある。 - ②
GROUP BY句を使っていないこと
データをグループ化してしまうと、ビュー上の1行が基底テーブルの複数行をまとめたものになってしまうため、どの行を更新すべきか特定できなくなる。 - ③
HAVING句を使っていないこと
GROUP BYと同様に、グループ化された集計結果に対する絞り込みを行う句が含まれているビューは更新対象外となる。 - ④ 集約関数(
SUM,AVG,COUNT,MAX,MINなど)を使っていないこと
計算・集計された結果の値を書き換えようとしても、基底テーブルの元のデータをどう変更すればよいか計算が成り立たないためである。 - ⑤ 計算列を使っていないこと
SELECT col1 + col2 AS totalのような演算式によって算出された列(計算列)は、直接値を書き換えることができない。 - ⑥
UNION、INTERSECT、EXCEPTを使っていないこと
集合演算子を用いて複数のクエリ結果を統合・比較しているビューは、データの出所を一意にマッピングできないため更新できない。 - ⑦
SELECT DISTINCT句を使っていないこと
重複行を排除(一意化)して表示されたビューは、実テーブルのどの行に対応しているかの追跡性が失われるため、更新が許可されない。 - ⑧ ビューに含まれない基底テーブルのすべての列が、NULLを許可するか、デフォルト値が指定されていること
ビュー経由でINSERT(行追加)を行う際、ビューに定義されていない列にはデータが渡らない。そのため、それらの列がNOT NULL(かつデフォルト値なし)の制約を持っていると、実テーブル側で制約エラーが発生して挿入できなくなる。
2. まとめ:実務でのアプローチ
上記のように、標準SQLでビューを更新可能にするためのハードルはかなり高い。実テーブルとビューの列が「1対1」できれいに対応しているシンプルなビューだけが、そのまま更新できる仕様になっている。
もし、これらの条件を満たさない複雑なビュー(複数テーブルの結合ビューなど)に対してどうしても更新処理を行いたい場合は、PostgreSQL等の主要なDBMSでサポートされているINSTEAD OF トリガーをビューに実装し、内部の更新ロジックを開発者が手動で記述するアプローチをとるのが一般的である。
【ビュー設計時のチェック項目】
□ 参照専用(読み取り専用)として利用するビューか?
□ アプリケーションからビューを介した DML 操作を想定しているか?
□ 条件を満たさない場合、トリガーによる代替ロジックの実装が必要か?
□ 参照専用(読み取り専用)として利用するビューか?
□ アプリケーションからビューを介した DML 操作を想定しているか?
□ 条件を満たさない場合、トリガーによる代替ロジックの実装が必要か?
PR