データ操作とビュー
データベースにおいて、ビューはテーブル(ベーステーブル)の結果セットを仮想的に表示するものです。ユーザーはビューに対してクエリを実行できるほか、特定の条件下ではデータ変更言語(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の制限が含まれていないこと。