MySQL ビューの一貫性を確保する方法の詳細な説明 (チェック オプション付き)

MySQL ビューの一貫性を確保する方法の詳細な説明 (チェック オプション付き)

この記事では、例を使用して、MySQL ビューの一貫性を確保する方法 (チェック オプションを使用) を説明します。ご参考までに、詳細は以下の通りです。

データの一部をテーブルに表示するためのビューを作成することもあります。単純なビューは透過的であるため、ビューを通じて表示されていないデータは更新できますが、この更新によってビューの一貫性が失われます。ビューの一貫性を確保するには、ビューを作成または変更するときに、WITH CHECK OPTION 更新可能句を使用します。 WITH CHECK OPTION 更新可能句の文法構造を見てみましょう。

ビュー view_name の作成または置換 
として
 選択ステートメント
 チェックオプション付き;

ビューを定義するには、SELECT ステートメントの末尾ではなく、WITH CHECK OPTION 句の末尾にセミコロン (;) を置くことに注意してください。ここで、VP マーケティングや VP セールスなど、役職が VP である従業員を表示するために、employees テーブルに基づいて vps という名前のビューを作成してみましょう。

VIEW VPS を作成または置換
  選択 
    従業員番号、
    苗字、
    ファーストネーム、
    役職、
    拡大、
    メール、
    オフィスコード、
    報告先
  から
    従業員
  どこ
    jobTitle は '%VP%' のように動作します。

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

mysql> SELECT * FROM vps;
+----------------+----------+-----------+---------------+------------+--------------------------+------------+------------+
| 従業員番号 | 姓 | 名 | 役職 | 内線番号 | 電子メール | オフィスコード | 報告先 |
+----------------+----------+-----------+---------------+------------+--------------------------+------------+------------+
| 1056 | ヒル | メアリー | 営業担当副社長 | x4611 | [email protected] | 1 | 1002 |
| 1076 | Firrelli | Jeff | マーケティング担当副社長 | x9273 | [email protected] | 1 | 1002 |
+----------------+----------+-----------+---------------+------------+--------------------------+------------+------------+
2行セット

vps は単純なビューなので更新可能であり、vps ビューを通じて従業員データ情報の行を挿入します。

INSERT INTO vps(従業員番号、名、姓、役職、内線番号、電子メール、オフィスコード、報告先)
値(1703,'Lily','Bush','IT マネージャー','x​​9111','[email protected]',1,1002);

新しく作成された従業員は、役職が VP ではなく IT マネージャーであるため、VPS ビューでは表示されないことに注意してください。確認するには、次の SELECT ステートメントを使用します。

SELECT * FROM employees WHERE employeeNumber=1703;

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

+----------------+-----------+------------+------------+------------+------------------------+----------+-----------------------+
| 従業員番号 | 姓 | 名 | 内線番号 | 電子メール | オフィスコード | 宛先 | 役職 |
+----------------+-----------+------------+------------+------------+------------------------+----------+-----------------------+
| 1703 | ブッシュ | リリー | x9111 | [email protected] | 1 | 1002 | IT マネージャー |
| 1702 | Gerard | Martin | x2312 | [email protected] | 4 | 1102 | 営業担当 |
| 1625 | 加藤 | 吉見 | x102 | [email protected] | 5 | 1621 | 営業担当 |
| 1621 | 西 | 真美 | x101 | [email protected] | 5 | 1056 | 営業担当 |

しかし、これは望んでいることではないかもしれません。なぜなら、vps ビューは VP 従業員を公開し、他の従業員は公開しないからです。したがって、ビューの一貫性を確保するために、ユーザーはビューを通じて表示されるデータのみを表示または更新できます。ビューを作成または変更するときは、WITH CHECK OPTION を使用します。

VIEW VPS を作成または置換
  選択 
    従業員番号、
    苗字、
    ファーストネーム、
    役職、
    拡大、
    メール、
    オフィスコード、
    報告先
  から
    従業員
  どこ
    ジョブタイトルは「%VP%」のように 
チェックオプション付き;

CREATE OR REPLACE ステートメントの最後に WITH CHECK OPTION 句を追加することに注意する必要があります。その後、次に示すように、vps ビューを介して再度 employees テーブルに行を挿入します。

INSERT INTO vps(従業員番号、名、姓、役職、内線番号、電子メール、オフィスコード、報告先)
VALUES(1704,'John','Minsu','IT スタッフ','x9112','[email protected]',1,1703);

この時点で、MySQL は挿入を拒否し、次のエラー メッセージを発行します。

エラー コード: 1369 - チェック オプションが失敗しました 'luyaran.vps'

MySQL がこれを許可するかどうかを確認するために、vps ビューを通じて SVP マーケティングの役職を持つ従業員を employees テーブルに挿入できます。

INSERT INTO vps(従業員番号、名、姓、役職、内線番号、電子メール、オフィスコード、報告先)
VALUES(1704,'John','Minsu','SVPマーケティング','x9112','[email protected]',1,1076);

MySQL は 1 行が影響を受けました (クエリ OK、1 行が影響を受けました)。vps ビューに従ってデータをクエリすることで、挿入操作を再度確認できます。

vps から * を選択します。

上記のクエリが示すように、期待どおりに動作します。

mysql> SELECT * FROM vps;
+----------------+----------+-----------+---------------+------------+--------------------------------+-------------+------------+
| 従業員番号 | 姓 | 名 | 役職 | 内線番号 | 電子メール | オフィスコード | 報告先 |
+----------------+----------+-----------+---------------+------------+--------------------------------+-------------+------------+
| 1056 | ヒル | メアリー | 営業担当副社長 | x4611 | [email protected] | 1 | 1002 |
| 1076 | Firrelli | Jeff | マーケティング担当副社長 | x9273 | [email protected] | 1 | 1002 |
| 1704 | Minsu | John | SVP マーケティング | x9112 | [email protected] | 1 | 1076 |
+----------------+----------+-----------+---------------+------------+--------------------------------+-------------+------------+
3行セット

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

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

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

以下もご興味があるかもしれません:
  • MySql8 WITH RECURSIVE 再帰クエリ親子コレクションメソッド
  • MySQL のインストール時に「MySQL という名前の Windows サービスが既に存在します。」というエラーを解決する方法
  • 暗黙の DEFAULT 値を持つ TIMESTAMP は MySQL 5.6 で非推奨エラーとなる
  • CURRENT_TIMESTAMP を使用した MySQL エラー TIMESTAMP 列の解決方法
  • MySQL のヒント: PID ファイルを更新せずにサーバーが終了する問題の解決方法
  • MySQL による PHP SQL インジェクション
  • MySQL 8.0 WITH クエリの詳細

<<:  Nginx を使用してグレースケール リリースを実装する

>>:  JavaScript の navigator.userAgent がブラウザ情報を取得するケースの説明

推薦する

波効果を作成するための CSS のトリック

純粋な CSS を使用して波の効果を実現することは、常に非常に困難でした。 波形曲線を実現するにはベ...

Python 仮想環境のインストールとアンインストールの方法と発生する問題

Ubuntu16.04 のインストールとアンインストール pip実験環境Ubuntu 16.04; ...

前後の秒、分、時間、日数を取得するMySQLデータベース

現在の時刻を取得します: current_timestamp を選択します。出力: 2016-06-...

TypeScript インターフェースの紹介

目次1. インターフェース定義2. 属性2.1 オプション属性2.2 読み取り専用プロパティ3. ク...

CentOs システムで Python と yum をアンインストールするソリューション

事故の背景: 数日前、プロジェクトの必要性により、サーバーに python-mysql モジュールを...

MySQL の分離レベルの包括的な分析

データベースが同じデータ バッチを同時に追加、削除、および変更すると、ダーティ書き込み、ダーティ読み...

Reactにおける不変値の説明

目次不変の値とは何ですか?不変の値を使用するのはなぜですか? Reactのパフォーマンス最適化は不変...

React Nativeでシンプルなゲームエンジンを作る

目次導入始めるReact Nativeゲームエンジンの簡単な紹介React Nativeでスネークゲ...

MySQLデュアルマスター(マスターマスター)アーキテクチャ構成ソリューション

企業では、データベースの高可用性は常に最優先事項です。多くの中小企業は、MySQL マスター スレー...

UbuntuにProtobuf 3をインストールするための詳細なチュートリアル

いつインストールするかprotoc コマンドを使用しても Protoc が見つからない場合は、インス...

CentOS8 Linux 8.0.1905 のインストール手順(図解)

現在、CentOS の最新バージョンは CentOS 8 です。次に、CentOS Linux 8....

JavaScriptイベント実行メカニズムの深い理解

目次序文ブラウザJS非同期実行の原理ブラウザのイベントループ実行スタックとタスクキューマクロタスクと...

HTML ウェブページにおけるさまざまなフォント形式の詳細

このセクションでは、テキストの変更の詳細から始めます。これにより、読者はさまざまな HTML フォン...

MySQL 数十億のデータのインポート、エクスポート、移行に関するメモ

最近はMySQLのメモをたくさん取っていますが、それは主に会社のOracleが比較的安定していてメン...

JavaScript で localStorage を使用する方法

.NET の世界に参入したい開発者であれば、何が可能なのかを知る必要があります。 .NET Fram...