MySQLで更新可能なビューを作成する方法の詳細な説明

MySQLで更新可能なビューを作成する方法の詳細な説明

この記事では、例を使用して、MySQL で更新可能なビューを作成する方法について説明します。ご参考までに、詳細は以下の通りです。

MySQL では、ビューはクエリ可能であるだけでなく、更新可能であることもわかっています。つまり、INSERT または UPDATE ステートメントを使用して、更新可能なビューを通じて基本テーブルの行を挿入または更新できます。 さらに、delete ステートメントを使用して、ビューを通じて基になるテーブルの行を削除することもできます。ただし、更新可能なビューを作成するには、ビューを定義する SELECT ステートメントに次の要素が含まれていてはなりません。

  • min、max、sum、avg、count などの集計関数。
  • DISTINCT 句
  • GROUP BY 句
  • HAVING 節
  • 左結合または外部結合。
  • UNION または UNION ALL 句
  • テーブルを参照する SELECT 句内のサブクエリまたは where 句内のサブクエリが FROM 句に表示されます。
  • FROM句で更新不可能なビューを参照する
  • リテラル値のみを引用符で囲む
  • ベーステーブルの任意の列への複数の参照

temptable アルゴリズムを使用してビューを作成する場合、ビューを更新することはできませんが、内部結合を使用して複数のテーブルに基づいて更新可能なビューを作成できる場合があります。では、早速、更新可能なビューを作成する方法を見てみましょう。まず、offices テーブルに基づいて officeInfo というビューを作成してみましょう。このビューは、offices テーブルの 3 つの列 (officeCode、phone、city) を参照します。

ビューの作成 officeInfo
 として
  オフィスコード、電話番号、都市を選択
  オフィスから;

次に、次のステートメントを使用して、officeInfo ビューからデータをクエリします。

選択
  *
から
  オフィス情報;

上記のクエリステートメントを実行すると、次の結果が得られます。

mysql> officeInfo から * を選択;
+------------+------------------+----------------+
| オフィスコード | 電話番号 | 都市名 |
+------------+------------------+----------------+
| 1 | +1 650 219 4782 | サンフランシスコ |
| 2 | +1 215 837 0825 | ボストン |
| 3 | +1 212 555 3000 | ニューヨーク |
| 4 | +33 14 723 4404 | パリ |
| 5 | +86 33 224 5000 | 北京 |
| 6 | +61 2 9264 2451 | シドニー |
| 7 | +44 20 7877 2041 | ロンドン |
+------------+------------------+----------------+
7行セット

次に、officeInfo ビューを通じて次の更新ステートメントを使用して、officeCode の値をオフィスの電話番号 4 に変更します。

オフィス情報を更新
セット
  電話番号 = '+86 089866668888'
どこ
  オフィスコード = 4;

最後に、officeInfo ビューでデータをクエリして変更を確認します。

mysql> 選択
  *
から
  オフィス情報
どこ
  オフィスコード = 4;

+------------+------------------+--------+
| オフィスコード | 電話番号 | 都市名 |
+------------+------------------+--------+
| 4 | +86 089866668888 | パリ |
+------------+------------------+--------+
セット内の1行

information_schema データベースの views テーブルから is_updatable 列をクエリすることで、データベース内のビューが更新可能かどうかを確認できます。たとえば、luyaran データベースをクエリしてすべてのビューを取得し、どのビューが更新可能かを表示します。

選択
  テーブル名、更新可能
から
  情報スキーマビュー
どこ
  table_schema = 'luyaran';

上記のクエリステートメントを実行すると、次の結果が得られます。

+------------------+--------------+
| テーブル名 | 更新可能 |
+------------------+--------------+
| 上記の平均製品 | はい |
| bigsalesorder | はい |
| 顧客注文 | いいえ |
| オフィス情報 | はい |
| 注文ごとの販売 | いいえ |
+------------------+--------------+
5行セット

ビューを通じて行を削除してみましょう。まず、items というテーブルを作成し、items テーブルにいくつかの行を挿入して、価格が 700 を超えるアイテムを照会するビューを作成します。

testdbを使用します。
-- items という名前の新しいテーブルを作成します
CREATE TABLE アイテム (
  id INT AUTO_INCREMENT 主キー、
  名前 VARCHAR(100) NOT NULL,
  価格 DECIMAL(11, 2) NOT NULL
);
-- アイテムテーブルにデータを挿入する
アイテムに挿入(名前、価格)
VALUES('ラップトップ',700.56),('デスクトップ',699.99),('iPad',700.50);
-- アイテムテーブルに基づいてビューを作成する
CREATE VIEW LuxuryItems AS
  選択
    *
  から
    アイテム
  どこ
    価格 > 700;
-- LuxuryItems ビューからデータをクエリする
選択
  *
から
  高級品;

上記のクエリステートメントを実行すると、次の結果が得られます。

+----+--------+--------+
| ID | 名前 | 価格 |
+----+--------+--------+
| 1 | ラップトップ | 700.56 |
| 3 | iPad | 700.5 |
+----+--------+--------+
2行セット

その後、DELETE ステートメントを使用して、ID 3 の行を削除します。

LuxuryItemsから削除
どこ
  id = 3;

mysql は、1 行が影響を受けたことを示すメッセージを返します。

クエリは正常、1 行が影響を受けました

ビューを通じてデータをもう一度確認してみましょう。

mysql> LuxuryItems から * を選択します。
+----+--------+--------+
| ID | 名前 | 価格 |
+----+--------+--------+
| 1 | ラップトップ | 700.56 |
+----+--------+--------+
セット内の1行

また、ベース テーブル items からデータをクエリして、DELETE ステートメントによって実際に行が削除されたことを確認することもできます。

mysql> SELECT * FROM items;
+----+---------+--------+
| ID | 名前 | 価格 |
+----+---------+--------+
| 1 | ラップトップ | 700.56 |
| 2 | デスクトップ | 699.99 |
+----+---------+--------+
2行セット

ベース テーブルで ID 3 の行が削除されていることがわかります。

さて、この記録についてはこれですべてです。

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL トランザクション操作スキル」、「MySQL ストアド プロシージャ スキル」、「MySQL データベース ロック関連スキルの概要」、および「MySQL 共通関数の概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQLにおけるビューの作成(CREATE VIEW)と使用制限の詳しい説明
  • MySQLでビューを作成する方法
  • MySQL ビューの原理と使用法の詳細な分析
  • MySQLのビューとインデックスの使い方と違いの詳細な説明
  • MySql ビュー、トリガー、ストアド プロシージャに関する簡単な説明
  • MySql ビュー トリガー ストアド プロシージャの詳細な説明
  • MySQLビューの原理と使用法の詳細な説明
  • MySQL ビュー管理ビューの例の詳細説明 [追加、削除、変更、クエリ操作]
  • MySQL における単一テーブルと複数テーブル、およびビューと一時テーブルに対する Update と Select の違い
  • mysql 3つのテーブルを接続してビューを作成する
  • MySQL ビューの原則分析

<<:  NginxとLuaによるグレースケールリリースの実装

>>:  Vueはシンプルなスライダー検証を実装する

推薦する

HTML で dl(dt,dd)、ul(li)、ol(li) を使用する方法

HTML <dl> タグ#定義と使用法<dl> タグは定義リストを定義します...

Baidu サイト検索が https をサポートしていない問題の解決策 (テスト済み)

最近、携帯電話で https が有効になりました。緑色のロックを取得するには、次の問題を解決する必要...

MySQL 5.7 mysql コマンドラインクライアントの使用コマンドの詳細

MySQL 5.7コマンドを使用するMySQLコマンドラインクライアント1. パスワードを入力してく...

WeChat アプレット wxss で外部 CSS ファイルとアイコンフォントを参照する方法

原因外部ファイルをミニプログラムにインポートする方法は次のとおりです: @import "...

Chrome プラグイン (拡張機能) 開発ガイド (完全デモ)

目次前面に書かれた序文ChromeプラグインとはChrome プラグイン開発を学ぶことの意義は何です...

Linux の sudo 脆弱性により不正な特権アクセスが発生する可能性がある

Linux で新たに発見された sudo の脆弱性を悪用すると、特定のユーザーが root としてコ...

CSS を使用してプログレスバーと順序プログレスバーを実装する例

この半月、期末試験の準備にかなりのエネルギーを費やしました。今日はしっかり復習するべきだったのですが...

MySQLのインストールと設定方法のグラフィックチュートリアル(CentOS7)

1. システム環境[root@localhost ホーム]# cat /etc/redhat-re...

Vue で HTML 5 ドラッグ アンド ドロップ API を使用する方法

ドラッグ アンド ドロップ API は、ドラッグ可能な要素を HTML に追加し、ドラッグ可能な豊富...

MySQL 制約の超詳細な説明

目次MySQL 制約操作1. 非ヌル制約2. ユニーク制約3. 主キー制約4. 外部キー制約5. カ...

Linux で top コマンドを使用する際のヒント

まず、top のいくつかのフィールドの意味を紹介します。 VIRT:仮想メモリ使用量1. プロセスが...

WeChatアプレットで数字当てゲームを実装する実際のプロセス

目次機能紹介レンダリング1. ホームページレンダリング用のコード(index03) 2. ゲーム開始...

MySQL 実行ステータスの表示と分析

MySQL のパフォーマンスに問題があると思われる場合は、通常、まずshow processlist...

ノードの対応するバージョンに関する簡単な説明 node-sass sass-loader

目次ノードのバージョンが一致しない、ノードをアップグレードまたはダウングレードするnvm を使用して...

JavaScript のマイクロタスクとマクロタスクの説明

序文: js はシングルスレッド言語なので、非同期にすることは不可能です。しかし、js のホスト環境...