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を使用することで、ビューの定義に合わないデータの挿入・更新を事前にブロックでき、ビューと基礎テーブルの間の不整合を防ぐことができます。部分的なデータのみを公開するビューを運用する場合は、必ずこのオプションの活用を検討しましょう。
-
MySQLでカスケード(テーブル定義)を表示する方法|SHOW CREATE TABLEの使い方
MySQLでテーブルの「カスケード」、つまりテーブルを作成した際のCREATE TABLE文の内容を確認したい場合は、SHOW CREATE TABLEステートメントを使用します。このコマンドを実行すると、カラムのデータ型、主キー、ユニークキー、インデックス、ストレージエンジン、文字セットといったテーブルの完全な定義を一度に確認できます。 手順1:サンプルテーブルを作成する まず、動作を確認するためのデモテーブルを作成しましょう。以下のSQLを実行します。 mysql> create table DemoTable1378 -> ( -> Id int N
-
MySQLビュー(VIEW)にWHERE句を使う方法をわかりやすく解説
MySQLビューでWHERE句を使用する方法MySQLでは、作成済みのビュー(VIEW)に対して、通常のテーブルと同じようにWHERE句を指定してデータを絞り込むことができます。基本となる構文は以下の通りです。select * from yourViewName where yourColumnName=yourValue;それでは、実際にサンプルを使って手順を確認していきましょう。1. サンプルテーブルを作成するまず、学生情報を格納するテーブルを作成します。mysql> create table DemoTable1432 -> ( -> StudentId