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版本,没法演示该效果。