第5章 更新可能なビュー
ビューは、updatable とマークできます。多くの場合、ビュー定義を使用すると、INSERT/UPDATE/DELETE
操作を処理するトリガーを手動で定義しなくても、ビューを基本的にデータブルにすることができます。
本質的には、以下のようなクエリーで定義できません。
-
セット操作(
INTERSECT
、EXCEPT
、UNION
) -
個別の を選択します
。 -
集約(集約関数、
GROUP BY
、HAVING
)。 -
LIMIT
句。
UNION ALL
は、各 UNION ブランチ自体が本質的にアップデータブルな場合にのみ、本質的にアップデータブルビューを定義できます。UNION ALL
で定義されるビューは、パーティション化されたユニオンの場合は、固有の INSERT
ステートメントに対応し、INSERT
は単一のパーティションに属する値を指定します。詳細は、『 Federated optimizations 』の「 partitioned union 」を参照してください。
列に直接マップされていない view 列は更新できないので、UPDATE set 句でターゲットまたは INSERT 列に対象にすることはできません。
ビューが結合クエリーによって定義されている場合や、WITH
句がある場合、依然としてキャッシュ可能なものである可能性があります。ただし、このような状況ではさらに制限があり、その結果のクエリー計画では複数のステートメントが実行される可能性があります。非単純なクエリーをデータブルにするには、以下の基準が適用されます。
-
INSERT/UPDATE
は、単一の key-preserved テーブルしか変更できません。 DELETE
操作を許可するには、1 つの key-preserved テーブルのみが必要です。key-preserved テーブルの詳細は、「 Key-preserved tables 」を参照してください。
デフォルトの処理が利用できない場合や、INSERT/UPDATE/DELETE
の代替実装が必要な場合は、更新手順またはトリガーを使用して各操作を処理する手順を定義することができます。詳細は、「 更新手順(Triggers) 」を参照してください。
以下で、本質的に updatable denormalized ビューの例を見てみましょう。
create foreign table parent_table (pk_col integer primary key, name string) options (updatable true); create foreign table child_table (pk_col integer primary key, name string, fk_col integer, foreign key (fk_col) references parent_table (pk_col)) options (updatable true); create view denormalized options (updatable true) as select c.fk_col, c.name as child_name, p.name from parent_table as p, child_table as c where p.pk_col = c.fk_col;
create foreign table parent_table (pk_col integer primary key, name string) options (updatable true);
create foreign table child_table (pk_col integer primary key, name string, fk_col integer, foreign key (fk_col) references parent_table (pk_col)) options (updatable true);
create view denormalized options (updatable true) as select c.fk_col, c.name as child_name, p.name from parent_table as p, child_table as c where p.pk_col = c.fk_col;
単一の key-preserved テーブル である
の挿入などのクエリーは成功します。ただし、各 child_table
をターゲットとするため、このビューに対して挿入(fk_col、child_name)parent_
すると失敗します。つまり、これは key-preserved ではありません。
table
キーに複数の行を持つ parent_table
にマップされるので、正規化(名前)値('a')に挿入
また、子エンティティーが関連付けられている可能性があるため、parent_table
に対する INSERT
がビューに表示されない可能性があります。
すべてのシナリオが機能する訳ではありません。上記の例では、p.
すると失敗します。ロジックはまだキーの値と同じであることを考慮しないためです。
pk_col
を使用して定義されるビューと共に denormalized(pk_col、child_name)値(<a')に挿入
5.1. key-preserved テーブル リンクのコピーリンクがクリップボードにコピーされました!
key-preserved テーブルには、クエリーの結果に展開される際に一意のままになるプライマリーキーまたは一意のキーがあります。SELECT 句のキー列を参照するのに実際に必要はないことに注意してください。クエリーエンジンは結合構造を分析して key-preserved テーブルを検出できます。エンジンは、key-preserved テーブルへの参加を外部キーのいずれかに対して行うようにします。