データ操作とビュー
データベースにおいて、ビューとはテーブル(基準テーブル)の結果セットに基づく仮想的な表示です。ユーザーはビューに対してクエリを実行することができ、特定の条件下ではデータ変更言語(DML)操作、例えば挿入、更新、削除などを行うことができます。ビューへの操作は基準テーブルのデータに直接影響を与え、基準テーブルの整合性制約やトリガーによって制御されます。
更新可能なビューの作成例
以下の例は、部門番号が10の従業員情報のみを含む staff_dept_10 という名前のビューを作成する方法を示しています。CHECK OPTION を使用して、ビューに対するDML操作がビュー定義のデータ範囲内に限定されるようにします。
そのため、部門番号が10の従業員の行データを挿入することはできますが、部門番号が30の従業員の行データを挿入することはできません。
CREATE VIEW staff_dept_10 AS
SELECT employee_id, last_name, job_id, manager_id, department_id
FROM employees
WHERE department_id = 10
WITH CHECK OPTION CONSTRAINT staff_dept_10_cnst;
ビューのデータアクセスプロセス
OceanBaseデータベースでは、ビューのクエリ文は内部データディクショナリに保存されます。ユーザーがビューを通じてデータを読み取る際、データベースは以下の手順を実行します:
- ユーザーのクエリを解析し、ビューに遭遇した場合はデータディクショナリからビューのクエリ文を取得して解析します。
- ビューのクエリとユーザーのクエリを統合し、より優れた実行計画を生成する可能性があります。
- 生成された実行計画に基づいてクエリを実行します。
ビュークエリアクセス例
staff_dept_10という名前のビューを作成し、以下のように定義します:CREATE VIEW staff_dept_10 AS SELECT employee_id, last_name, job_id, manager_id, department_id FROM employees WHERE department_id = 10ユーザーは以下のクエリで
staff_dept_10ビューにアクセスします:SELECT last_name FROM staff_dept_10 WHERE employee_id = 200;OceanBaseデータベースは上記のクエリを次のように解析します:
SELECT last_name FROM (SELECT employee_id, last_name, job_id, manager_id, department_id FROM employees WHERE department_id = 10) staff_dept_10 WHERE employee_id = 200;データベースはクエリを書き換えて、ビューをメインクエリにマージしようとします:
SELECT last_name FROM employees WHERE employee_id = 200 AND department_id = 10;実行計画を生成し、対応するSQLを実行します。
更新可能なビュー
ビューはデータの読み取りに使用されるだけでなく、データの更新にも使用できます。このタイプのビューを更新可能なビューと呼びます。更新可能なビューに対しては、ユーザーは更新や削除などの操作を実行できます。
更新操作の例
例えば、以前に作成された staff_dept_10 ビューに対して、ユーザーは削除操作を実行できます:
DELETE FROM staff_dept_10 WHERE employee_id = 200;
OceanBaseデータベースがこのリクエストを処理するプロセスは以下のとおりです:
- ステートメントを解析し、
staff_dept_10をビューの定義に置き換えます。 - ビューが更新対象として必要な制約条件を満たしているかどうかを検証します。
- ビューをメインステートメントにマージします。
- 実行計画を生成して操作を実行します。
内部では、OceanBaseデータベースが実際に実行するのは次のとおりです:
DELETE FROM employees WHERE employee_id = 200 AND department_id = 10;
ビューが更新可能かどうかは、以下の条件によって決まります:
- 更新操作は単一のエンティティテーブルにのみ関係します。
- ビューのクエリにおいて、各行データは変更されるテーブル内で唯一のエンティティを表します。多対多接続ではこの操作は許可されません。
- ビューに
WITH READ ONLYの制限が含まれていないこと。