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 がブラウザ情報を取得するケースの説明

推薦する

読み取り専用と無効の微妙な違いの詳細な説明

「読み取り専用」と「無効」はどちらも、ユーザーがフォーム フィールドの内容を変更できないようにします...

js に基づいて大きなファイルのアップロードとブレークポイントの再開を管理する方法

目次序文フロントエンド構造バックエンド構造(ノード+エクスプレス) FormDataに基づくファイル...

Linux における nohup と & の使い方と違いの詳細な説明

例:例として、Python コード loop_hello.py を使用します。このコードは、ループ回...

MySQLの重複排除操作を極限まで最適化する方法

目次1. インデックスと変数の賢い使用1. インデックスなしの比較テスト2. created_tim...

HTML タグの表示モード (ブロックレベル タグ、インライン タグ、インライン ブロック タグ) に関する簡単な説明

今日の講義では、HTML におけるタグの表示モードについてお話ししましたが、これはブロックレベルタグ...

MySQLクエリプランでken_lenの値を計算する方法

key_lenの意味MySQL では、次に示すように、explain を使用して SQL ステートメ...

Dockerイメージをパッケージ化し、リモートサーバーにプッシュしてk8sにデプロイする方法

目次1. Dockerファイル2. pom 構成3. イメージプッシュ4. k8s デプロイメント前...

Docker で MySQL を起動したときに SQL 文を自動的に実行する方法

Docker で MySQL コンテナを作成する場合、コンテナの起動後にデータベースとテーブルが自動...

MySQL の datetime フィールドの丸め操作

目次序文1. 背景2. シミュレーションテスト3. 結論要約する序文もし私が罠に陥っていなかったら、...

負のマージントップ値は、ラベルテキストと入力の間の垂直中央揃えの問題を解決します。

ラベルテキストと入力の垂直方向の中央揃えを調整するのは簡単ではありません。padding、verti...

zabbix 4.04 の詳細なインストール チュートリアル (CentOS 7.6 ベース)

1. インストール前の準備: 1.1 JDKをインストールするopenjdkをアンインストールする...

vue+openlayer をベースにマップの集約と散乱効果を実現

目次序文:結果: 1.重合効果: 2. 散布効果:具体的な実装手順: 1. プロジェクトにOpenL...

mysql-8.0.17-winx64 のデプロイメント方法

1. 公式サイトからmysql-8.0.17-winx64をダウンロードし、Zipファイル形式を選択...

TypeScript インターフェース定義ケースチュートリアル

インターフェースの役割:インターフェース (英語: interface) の機能は、簡単に言えば、コ...

ServerSocketのデフォルトIPバインディングの実装プロセスの詳細な説明

開発中にサーバーを起動する必要がある場合、ローカルテストではポートを直接書き込み、実際の環境ではバイ...