mysql中的视图是一种虚表。
创建视图的时候with check option选项可以检查一些数据检查,避免脏数据的录入。
举例:
首先我们创建一个数据库表t,为了讲解with check option的作用,字段就弄的简单点。
mysql> create table t(id int);
Query OK, 0 rows affected (0.03 sec)
我们创建一个视图v
mysql> create view v as select * from t where id>10;
Query OK, 0 rows affected (0.01 sec)
没有带with check option选项的视图v,其实是不能避免插入脏数据的。
mysql> insert into v(id) values(5);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t;
+------+
| id |
+------+
| 5 |
+------+
1 row in set (0.00 sec)
发现id=5的数据能成功插入,这个不是我们希望的效果。
测试with check option的作用。
重新替换视图v。
mysql> create or replace view v as select * from t where id>10 with check option;
Query OK, 0 rows affected (0.01 sec)
我们插入id=8的数据,发现插入不了,报如下错:
mysql> insert into v(id) values(8);
ERROR 1369 (HY000): CHECK OPTION failed 'test.v'
mysql> select * from t;
+------+
| id |
+------+
| 5 |
+------+
1 row in set (0.00 sec)
id=8的数据没有被插入,id=5的数据还是之前插入的。
解释:
如没有指定关键字,则with check option默认是cascade,即级联检查,等价于with cascaded check option
文档上也有说明:
为了确定检查的范围,mysql提供了两个选项:LOCAL和CASCADED。如果我们没有在WITH CHECK OPTION子句中显式指定关键字,则mysql默认使用CASCADED。
如果视图使用WITH LOCAL CHECK OPTION,MySQL仅对视图的列作检查。与使用WITH CASCADED CHECK OPTION的视图不同,MySQL检查所有依赖视图的规则。
请注意,在MySQL 5.7.6之前,如果您使用带有WITH LOCAL CHECK OPTION的视图,MySQL只会检查当前视图的规则,并且不会检查底层视图的规则。
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.33 |
+-----------+
1 row in set (0.00 sec)
由于我的mysql是5.6.33版本,没法演示该效果。