Với view có thể cập nhật (updatable view), có thể cập nhật dữ liệu không hiển thị qua view (vì view chỉ lộ một phần dữ liệu), dẫn đến view không nhất quán. Đảm bảo nhất quán bằng WITH CHECK OPTION khi tạo/sửa view.
Mệnh đề WITH CHECK OPTION (tùy chọn của CREATE VIEW) ngăn chặn INSERT/UPDATE hàng không thỏa định nghĩa view. MySQL đảm bảo thao tác chèn/sửa phải thỏa WHERE của view.
Cú pháp
CREATE OR REPLACE VIEW view_name AS Select_statement WITH CHECK OPTION;
Ví dụ
Bảng 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)
Tạo view Info không dùng 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)
Chèn hàng không khớp định nghĩa (Subject=Economics):
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)
Hàng mới đã vào bảng gốc nhưng không hiện trong view → view không nhất quán.
Tạo lại view CÓ 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)
Chèn hàng khớp định nghĩa (Subject=Computers):
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)
Chèn hàng không khớp định nghĩa (Subject=Geophysics):
mysql> INSERT INTO Info(Id, Name, Address, Subject) values(134, 'Charanjeet','Amritsar','Geophysics');
ERROR 1369 (HY000): CHECK OPTION failed
MySQL từ chối và báo lỗi CHECK OPTION failed.