VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
ビューの作成と照会
CREATE OR REPLACE VIEW を使用します。
更新可能なビュー
一部のビューは、ビューを通じたINSERT、UPDATE、および DELETE をサポートします。ビューが単一の基になるテーブルにきれいに対応する場合、そのビューは更新可能です。
- 書き込むすべての列が単一の基になるテーブルに属している。JOIN に対するビューもこのルールのもとでは更新可能ですが、それを通じた
INSERTは黙って一方のテーブルだけに作用し、もう一方には行をまったく挿入しません。ただし、1 つのINSERTで両方の基になるテーブルの列に書き込む場合は黙って行われず、ERROR 1393: Can not modify more than one base table through a join viewが発生します DISTINCTがない- 集計関数(
SUM、COUNTなど)がない GROUP BYやHAVINGがないWHERE句に同じテーブルを参照するサブクエリがないUNIONがない
customers テーブルを更新します。ビューが行を絞り込んでいる場合、ビューを通じて見えなくなる値に行を UPDATE できます。その行は基のテーブルには存在し続けますが、ビューからは消えます。
WITH CHECK OPTION
WITH CHECK OPTION は、ビューを通じて行が見えなくなるような、ビュー経由の挿入と更新を防ぎます。
WITH CHECK OPTION を使用してください。
ビューのアルゴリズム
MySQL は、2 つのアルゴリズムのいずれかを使用してビューを実行します。TEMPTABLE は、外側のクエリが実行される前にビューの結果全体が計算されることを意味します。オプティマイザは、外側のクエリの WHERE 条件をビューにプッシュダウンすることができません。TEMPTABLE ビューで絞り込みを効率的に機能させるには、フィルタがビュー自身の定義の中になければなりません。
不意打ちを避けるには、アルゴリズムを明示的に指定します。
ALGORITHM=UNDEFINED として格納します。SHOW CREATE VIEW が報告するのはこれであり、TEMPTABLE ではありません。オプティマイザはその後、実行時にそうしたビューを実体化します。
ビューにはインデックスがない
ビューは独自のインデックスを持ちません。MERGE ビューに対するクエリは、基になるテーブルのインデックスを使用できます。TEMPTABLE ビューに対するクエリは使用できません。一時テーブルにはインデックスがないためです。
頻繁に照会されるビューの結果にインデックスが必要な場合、選択肢は次のとおりです。
- ビューが
MERGEアルゴリズムを使用するようにし、基になるテーブルの列にインデックスを作成する - ビューを、ジョブやトリガーによってデータが投入される実テーブルに置き換える
よくある質問
ビューはいつ使うべきですか?
ビューは、アクセス制御(列や行のサブセットをユーザーに公開する)、複数のクエリが使用する複雑な結合の単純化、および基になるスキーマが変わりうる場合に安定したインターフェースを提供することに適しています。ビューはパフォーマンスのための道具ではありません。データをキャッシュしたり格納したりはしません。ビューを結合できますか?
はい。2 つのMERGE ビューを結合することは、事実上 2 つの基になるクエリを結合することです。MySQL は全体を書き換えます。TEMPTABLE ビューの結合は、各ビューがまず独立して実体化されるため遅くなります。複雑な結合では、共通テーブル式のほうが実行をより細かく制御できることがよくあります。
基になるテーブルが変わると、ビューは自動的に更新されますか?
ビューの定義は SQL テキストとして格納されます。基のテーブルに列を追加しても、ビューからのSELECT * にはその列は含まれません。CREATE OR REPLACE VIEW が必要です。ビューが参照する列の名前を変更したり削除したりすると、ビューは無効になり、再作成するまでそのビューに対するクエリはエラーになります。
トラブルシューティング
関連項目
- MySQL における正規化 — ビューは正規化されたスキーマに対するクエリを単純化できます
- MySQL の JOIN のパフォーマンスとよくある間違い — ビューはしばしば結合ロジックをカプセル化します
- MySQL の結合の仕組み — ビューの定義が使用する結合の構文
- MySQL におけるサブクエリと JOIN の比較 — ビューが包むクエリの形
- MySQL のソフトデリート — 削除済みの行を有効行のビューの背後に隠す