轻松上手,快乐学习!

MySQL 教程

MySQL 首页MySQL 介绍MySQL 安装MySQL 实例库下载MySQL 实例库导入MySQL SELECTMySQL DISTINCTMySQL ORDER BYMySQL WHEREMySQL ANDMySQL ORMySQL INMySQL BETWEENMySQL LIKEMySQL LIMITMySQL IS NULLMySQL 别名MySQL JOINSMySQL INNER JOINMySQL LEFT JOINMySQL RIGHT JOINMySQL CROSS JOINMySQL SELF JOINMySQL GROUP BYMySQL HAVINGMySQL ROLLUPMySQL 子查询MySQL 派生表MySQL EXISTSMySQL CTEMySQL 递归 CTEMySQL UNIONMySQL INTERSECTMySQL MINUSMySQL INSERTMySQL INSERT INTO SELECTMySQL INSERT IGNOREMySQL UPDATEMySQL UPDATE JOINMySQL DELETEMySQL ON DELETE CASCADEMySQL DELETE JOINMySQL REPLACEMySQL PREPAREMySQL 事务MySQL 表锁定MySQL USEMySQL 数据库管理MySQL CREATE DATABASEMySQL DROP DATABASEMySQL 存储引擎MySQL CREATE TABLEMySQL 序列MySQL ALTER TABLEMySQL RENAME TABLEMySQL DROP COLUMNMySQL ADD COLUMNMySQL DROP TABLEMySQL 临时表MySQL TRUNCATE TABLEMySQL 数据类型MySQL NOT NULLMySQL Primary KeyMySQL Foreign KeyMySQL UNIQUEMySQL CHECKMySQL 字符集MySQL 排序规则MySQL 导入 CSVMySQL 导出 CSVMySQL 自然排序MySQL 基础

MySQL 存储过程

MySQL 存储过程介绍MySQL 存储过程实例MySQL 存储过程变量MySQL 存储过程参数MySQL 存储过程返回多值MySQL IF 语句MySQL CASE 语句MySQL IF CASE 选择MySQL 存储过程循环MySQL 存储过程游标MySQL 存储过程列表MySQL 存储过程异常处理MySQL SIGNAL 和 RESIGNALMySQL 存储函数

MySQL 视图

MySQL 视图教程SQL 视图介绍MySQL 视图介绍MySQL 创建视图MySQL 可更新视图WITH CHECK OPTIONLOCAL&CASCADEDMySQL 视图管理

MySQL 触发器

MySQL 触发器SQL 触发器MySQL 触发器介绍MySQL 触发器的创建MySQL 创建多个触发器MySQL 触发器管理MySQL 计划事件MySQL事件修改

MySQL 索引

MySQL 索引MySQL 索引创建MySQL 索引删除MySQL 显示索引MySQL 唯一索引MySQL 前缀索引MySQL 隐形索引MySQL 降序索引MySQL 复合索引MySQL 聚集索引MySQL 索引基数MySQL USE INDEXMySQL 强制索引

MySQL 管理

MySQL 管理MySQL访问控制系统MySQL 用户创建MySQL 用户密码MySQL 权限授予MySQL 权限撤销MySQL 角色MySQL 删除用户MySQL 表维护mysqldump 备份工具MySQL 数据库列表MySQL 表列表MySQL 表字段列表MySQL 用户列表MySQL 进程列表MySQL 列生成比较MySQL中同一表中的连续行

MySQL 全文搜索

MySQL 全文搜索MySQL 全文搜索介绍FULLTEXT索引MySQL 自然语言全文搜索MySQL 布尔全文搜索MySQL查询扩展MySQL ngram

MySQL 高级

MySQL 函数MySQL 窗口函数

MySQL 技巧

MySQL 查找重复数据MySQL 删除重复数据MySQL UUIDMySQL 表的复制MySQL 复制库MySQL 变量MySQL SELECT INTO 变量MySQL 表的存储引擎MySQL 使用正则查询MySQL 添加序号MySQL 随机查询MySQL 查询第 N 高记录MySQL 重置自增值MySQL VS MariaDBMySQL 间隔值MySQL 获取当天日期MySQL NULL 映射MySQL 注释理解MySQL EXPLAINMySQL 技巧介绍MySQL COUNTMySQL 数据分层MySQL 两表比较Mysql Like 优化

MySQL 窗口函数

MySQL CUME_DIST() 函数MySQL DENSE_RANK() 函数MySQL FIRST_VALUE 函数MySQL LAG() 函数MySQL LAST_VALUE() 函数MySQL LEAD 函数MySQL NTH_VALUE 函数MySQL NTILE 函数MySQL PERCENT_RANK 函数MySQL RANK 函数MySQL ROW_NUMBER 函数

MySQL 应用

MySQL应用程序编程接口PHP MySQL教程PHP 数据库连接

MySQL 优化

mysqld 内存持续变高


WITH CHECK OPTION 中 LOCAL和CASCADED


简介:本教程通过示例和明确说明帮助您了解LOCALCASCADED在 WITH CHECK OPTION子句之间的差异。

在开始本教程之前,您应熟悉WITH CHECK OPTION子句。如果不是这种情况,您可以使用WITH CHECK OPTION子句教程遵循确保视图的一致性


LOCAL&CASCADED检查范围简介

当您使用WITH CHECK OPTION子句创建视图时,MySQL会检查通过视图更改的每一行,例如插入更新删除,以使其符合视图的定义。由于MySQL允许基于另一个视图创建视图,因此它还会检查从属视图中的规则以确保一致性。

为了确定检查范围,MySQL提供了两个选项:LOCALCASCADED。如果未在WITH CHECK OPTION子句中明确指定关键字,则MySQL CASCADED默认使用。


MySQL WITH CASCADED CHECK OPTION

为了理解其效果  WITH CASCADED CHECK OPTION,我们将举例说明。

首先,我们创建一个表名为t1,其中一列c的数据类型为整数。

DROP TABLE IF EXISTS t1;

CREATE TABLE t1 (
    c INT
);

接下来,我们基于t1表创建一个名为v1的视图,以选择值大于10的行。

CREATE OR REPLACE VIEW v1 
AS
    SELECT 
        c
    FROM
        t1
    WHERE
        c > 10;

因为我们没有指定WITH CHECK OPTION,所以即使它不符合v1视图的定义,下面的语句仍然有效。

INSERT INTO v1(c) VALUES (5);

然后,我们基于v1视图创建v2视图。这次,我们添加一个WITH CASCADED CHECK OPTION条款。

CREATE OR REPLACE VIEW v2 
AS
    SELECT 
        c
    FROM
        v1 
WITH CASCADED CHECK OPTION;

现在,我们  通过v2视图值为5 的行插入到t1表中。

INSERT INTO v2(c) VALUES (5);

MySQL发出以下错误消息:

ERROR 1369 (HY000): CHECK OPTION failed 'mysqldemo.v2'

它失败,因为它创建了一个不符合v2视图定义的新行。

之后,我们基于v2创建一个名为v3的新视图。

CREATE OR REPLACE VIEW v3 
AS
    SELECT 
        c
    FROM
        v2
    WHERE
        c < 20;

我们通过v3视图在t1表中插入一个值为8的新行。

INSERT INTO v3(c) VALUES (8);

MySQL发出以下错误消息:

ERROR 1369 (HY000): CHECK OPTION failed 'mysqldemo.v3'

INSERT语句失败,即使它看起来与V3视图的定义一致。

为什么?

因为v3视图依赖于v2视图,而v2视图具有WITH CASCADED CHECK OPTION

但是,以下插入语句有效。

INSERT INTO v3(c) VALUES (30);

因为v3视图没有WITH CHECK OPTION,并且语句符合v2视图的定义。

所以,最后:

当视图使用WITH CASCADED CHECK OPTION时,MySQL会以递归方式检查视图的规则以及基础视图的规则。

MySQL with CASCADED CHECK OPTION


MySQL与本地检查选项

让我们使用上面的相同示例WITH LOCAL CHECK OPTION来查看差异。

首先,我们更改v2视图以使用WITH LOCAL CHECK OPTION替代。

ALTER VIEW v2 AS
    SELECT 
        c
    FROM
        v1 
WITH LOCAL CHECK OPTION;

其次,插入与上面示例相同的行。

INSERT INTO v2(c) VALUES (5);

它成功了。

因为v2视图没有任何规则。v2视图取决于v1视图。但是,v1视图未指定检查选项,因此MySQL会跳过检查v1视图中的规则。

请注意,在使用WITH CASCADED CHECK OPTION创建的v2视图,此语句失败。

第三,通过v3视图将同一行插入到t1表中。

INSERT INTO v3(c) VALUES (8);

它在这种情况下成功,因为MySQL没有检查v1视图的规则,因为WITH LOCAL CHECK OPTIONv2视图。

另外请注意,在使用WITH CASCADED CHECK OPTION创建的v2的示例中,此语句失败。

MySQL与本地检查选项

因此,如果视图使用 WITH LOCAL CHECK OPTION,MySQL将检查具有WITH LOCAL CHECK OPTIONWITH CASCADED CHECK OPTION的视图规则。

它与使用WITH CASCADED CHECK OPTIONMySQL检查所有相关视图的规则的视图不同。

请注意,在MySQL 5.7.6之前,如果使用带有WITH LOCAL CHECK OPTION的视图,MySQL仅检查当前视图的规则,而不检查基础视图的规则。