MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLビューの整合性が崩れる原因とWITH CHECK OPTIONで一貫性を確保する方法

MySQLビューの整合性が崩れるケースとは

更新可能なビュー(updatable view)では、ビューを通しては見えないデータを更新してしまう可能性があります。これは、ビューがテーブルの一部のデータだけを表示する目的で作成されることが多いためです。このような更新が行われると、ビューは不整合な状態になってしまいます。

ビューの整合性を確保するには、ビューを作成または変更する際にWITH CHECK OPTIONを使用します。WITH CHECK OPTION句はCREATE VIEW文において省略可能な句ですが、ビューの一貫性を維持するうえで非常に有用です。

WITH CHECK OPTIONの仕組み

基本的に、WITH CHECK OPTION句は、ビューを通して見えない行の更新や挿入を防ぎます。簡単に言えば、この句を使用すると、MySQLはINSERTやUPDATEの操作がビューの定義に適合しているかどうかを検証するようになります。なお、MySQLではチェックオプションとしてCASCADED(デフォルト)とLOCALの2種類があり、特に指定しない場合はCASCADEDが適用されます。

構文

CREATE OR REPLACE VIEW view_name AS Select_statement WITH CHECK OPTION;

実例で学ぶWITH CHECK OPTION

ここからは具体例を見ていきましょう。まず、テーブル「student_info」に以下のデータが格納されているものとします。

mysql> Select * from student_info;
+------+---------+------------+------------+
| id   | Name    | Address    | Subject    |
+------+---------+------------+------------+
| 101  | YashPal | Amritsar   | History    |
| 105  | Gaurav  | Chandigarh | Literature |
| 125  | Raman   | Shimla     | Computers  |
| 130  | Ram     | Jhansi     | Computers  |
+------+---------+------------+------------+
4 rows in set (0.08 sec)

WITH CHECK OPTIONなしでビューを作成した場合

次のクエリで、ビュー「Info」を作成します。この時点ではWITH CHECK OPTIONを使用していません。

mysql> Create OR Replace VIEW Info AS Select Id, Name, Address, Subject from student_info WHERE Subject = 'Computers';
Query OK, 0 rows affected (0.46 sec)

mysql> Select * from info;
+------+-------+---------+-----------+
| Id   | Name  | Address | Subject   |
+------+-------+---------+-----------+
| 125  | Raman | Shimla  | Computers |
| 130  | Ram   | Jhansi  | Computers |
+------+-------+---------+-----------+
2 rows in set (0.00 sec)

WITH CHECK OPTIONを使用していないため、ビュー「Info」の定義に一致しない行であっても、挿入や更新ができてしまいます。実際に確認してみましょう。

mysql> INSERT INTO Info(Id, Name, Address, Subject) values(132, 'Shyam','Chandigarh', 'Economics');
Query OK, 1 row affected (0.37 sec)

mysql> Select * from student_info;
+------+---------+------------+------------+
| id   | Name    | Address    | Subject    |
+------+---------+------------+------------+
| 101  | YashPal | Amritsar   | History    |
| 105  | Gaurav  | Chandigarh | Literature |
| 125  | Raman   | Shimla     | Computers  |
| 130  | Ram     | Jhansi     | Computers  |
| 132  | Shyam   | Chandigarh | Economics  |
+------+---------+------------+------------+
5 rows in set (0.00 sec)

mysql> Select * from info;
+------+-------+---------+-----------+
| Id   | Name  | Address | Subject   |
+------+-------+---------+-----------+
| 125  | Raman | Shimla  | Computers |
| 130  | Ram   | Jhansi  | Computers |
+------+-------+---------+-----------+
2 rows in set (0.00 sec)

この結果セットを見ると、新しく挿入された行は「Info」の定義(Subject = 'Computers')と一致していないため、ビュー上には表示されません。基礎テーブルにはデータが追加されているのに、ビューからは見えない——これがビューの不整合状態です。

WITH CHECK OPTIONありでビューを作成した場合

次に、同じビュー「Info」をWITH CHECK OPTION付きで再作成します。

mysql> Create OR Replace VIEW Info AS Select Id, Name, Address, Subject from student_info WHERE Subject = 'Computers' WITH CHECK OPTION;
Query OK, 0 rows affected (0.06 sec)

この状態で、ビュー「Info」の定義に一致する行を挿入しようとすると、MySQLはその操作を許可します。

mysql> INSERT INTO Info(Id, Name, Address, Subject) values(133, 'Mohan','Delhi','Computers');
Query OK, 1 row affected (0.07 sec)

mysql> Select * from info;
+------+-------+---------+-----------+
| Id   | Name  | Address | Subject   |
+------+-------+---------+-----------+
| 125  | Raman | Shimla  | Computers |
| 130  | Ram   | Jhansi  | Computers |
| 133  | Mohan | Delhi   | Computers |
+------+-------+---------+-----------+
3 rows in set (0.00 sec)

一方、ビュー「Info」の定義に一致しない行を挿入しようとすると、MySQLは操作を許可せず、エラーを返します。

mysql> INSERT INTO Info(Id, Name, Address, Subject) values(134, 'Charanjeet','Amritsar','Geophysics');
ERROR 1369 (HY000): CHECK OPTION failed

まとめ

WITH CHECK OPTIONを使用することで、ビューの定義に合わないデータの挿入・更新を事前にブロックでき、ビューと基礎テーブルの間の不整合を防ぐことができます。部分的なデータのみを公開するビューを運用する場合は、必ずこのオプションの活用を検討しましょう。

  1. MySQLでカスケード(テーブル定義)を表示する方法|SHOW CREATE TABLEの使い方

    MySQLでテーブルの「カスケード」、つまりテーブルを作成した際のCREATE TABLE文の内容を確認したい場合は、SHOW CREATE TABLEステートメントを使用します。このコマンドを実行すると、カラムのデータ型、主キー、ユニークキー、インデックス、ストレージエンジン、文字セットといったテーブルの完全な定義を一度に確認できます。 手順1:サンプルテーブルを作成する まず、動作を確認するためのデモテーブルを作成しましょう。以下のSQLを実行します。 mysql> create table DemoTable1378 -> ( -> Id int N

  2. MySQLビュー(VIEW)にWHERE句を使う方法をわかりやすく解説

    MySQLビューでWHERE句を使用する方法MySQLでは、作成済みのビュー(VIEW)に対して、通常のテーブルと同じようにWHERE句を指定してデータを絞り込むことができます。基本となる構文は以下の通りです。select * from yourViewName where yourColumnName=yourValue;それでは、実際にサンプルを使って手順を確認していきましょう。1. サンプルテーブルを作成するまず、学生情報を格納するテーブルを作成します。mysql> create table DemoTable1432 -> ( -> StudentId