MySQL 入门教程
  • 教程目录
  • 第一章 基础教程
    • 第一节 入门
      • 1.1 安装
      • 1.2 示例数据库
    • 第二节 查询数据
      • 2.1 SELECT 语句
      • 2.2 SELECT DISTINCT 语句
    • 第三节 过滤数据
      • 3.1 WHERE 子句
      • 3.2 AND 运算符
      • 3.3 OR 运算符
      • 3.4 IN 运算符
      • 3.5 BETWEEN 运算符
      • 3.6 LIKE 运算符
      • 3.7 LIMIT 子句
      • 3.8 IS NULL 运算符
    • 第四节 数据排序
      • 4.1 ORDER BY 子句
      • 4.1 自然排序
    • 第五节 连接表
      • 5.1 别名
      • 5.2 INNER JOIN
      • 5.3 LEFT JOIN
      • 5.4 自连接
      • 5.5 CROSS JOIN
    • 第六节 分组数据
      • 6.1 GROUP BY子句
      • 6.2 HAVING 子句
    • 第七节 子查询,派生表和通用表达式
      • 7.1 子查询
      • 7.2 派生表
      • 7.3 公共表表达式
      • 7.4 递归 CTE
    • 第八节 集合操作符
      • 8.1 UNION 和 UNION ALL
      • 8.2 INTERSECT 模拟
    • 第九节 修改数据
      • 9.1 INSERT 语句
      • 9.2 INSERT IGNORE
      • 9.3 UPDATE 语句
      • 9.4 UPDATE JOIN 语句
      • 9.5 DELETE
      • 9.6 ON DELETE CASCADE.
      • 9.7 DELETE JOIN
      • 9.8 REPLACE 语句
      • 9.9 PREPARE 语句
    • 第十节 事务
      • 10.1 事务介绍
      • 10.2 表锁定
    • 第十一节 管理数据库和表
      • 11.1 数据库管理
      • 11.2 MySQL 表类型
      • 11.3 CREATE TABLE
      • 11.4 序列
      • 11.5 ALTER TABLE
      • 11.6 重命名表
      • 11.7 从表中删除列
      • 11.8 向表中添加新列
      • 11.9 删除表
      • 11.10 临时表
      • 11.11 TRUNCATE TABLE
    • 第十二节 索引
      • 12.1 管理索引
      • 12.1 UNIQUE 索引
    • 第十三节 数据类型
      • 13.1 INT
      • 13.2 DECIMAL
      • 13.3 BIT
      • 13.4 BOOLEAN
      • 13.5 CHAR
      • 13.6 VARCHAR
      • 13.7 TEXT
      • 13.8 DATE
      • 13.9 TIME
      • 13.10 DATETIME
      • 13.11 TIMESTAMP
      • 13.12 JSON
      • 13.13 ENUM
    • 第十四节 约束
      • 14.1 NOT NULL 约束
      • 14.2 主键约束
      • 14.2 外键约束
      • 14.4 UNIQUE 约束
      • 14.5 CHECK 约束
    • 第十五节 全球化
      • 15.1 字符集
      • 15.2 校对规则
    • 第十六节 导入和导出
      • 16.1 导入 CSV 文件
      • 16.2 导出为 CSV
  • 第二章 技巧
    • CTE 简介
    • 递归 CTE
    • 邻接列表模型和层次结构
    • 获取行数
    • 比较表
    • 找重复值
    • 删除重复行
    • UUID 和主键
    • 复制表数据
    • 变量
    • 生成列
    • 连续行比较
    • 更改存储引擎
    • 基于正则表达式的搜索
    • row_number 模拟
    • 随机选择记录
    • 选择第 n 个最高纪录
    • 重置自动增量值
    • MariaDB 与 MySQL 比较
    • 间隔
    • NULL 详细和应用
    • 获取今天的日期
    • 将NULL值映射到有意义的值
    • 注释
  • 第三章 存储过程
    • 简介
    • 入门
    • 变量
    • 参数
    • 返回多个值
    • IF语句
    • CASE语句
    • IF和CASE语句的技巧
    • 循环
    • 游标
    • 列出存储过程
    • 错误处理
    • SIGNAL 和 ESIGNAL 语句
    • 存储函数
  • 第四章 触发器
    • 实现
    • 创建
    • 创建多个触发器
    • 管理
    • 计划事件
    • 修改事件
  • 第五章 视图
    • 简介
    • 实现和限制
    • 创建
    • 可更新视图
    • 确保视图一致性
    • 检查选项子句
    • 管理
  • 第六章 全文搜索
    • 简介
    • 定义索引
    • 自然语言全文搜索
    • 布尔全文搜索
    • 查询扩展
    • ngram全文解析器
  • 第七章 函数
  • 第八章 管理
    • 访问控制系统入门
    • 创建用户
    • 授予权限
    • 撤销权限
    • 角色管理
    • 删除用户
    • 维护数据库表
    • 备份数据库
    • 列出数据库
    • 列出表
    • 列出表的列
    • 列出用户
Powered by GitBook
On this page
  • LOCAL&CASCADED检查范围介绍
  • MySQL与CASCADC检查选项
  • MySQL WITH LOCAL CHECK OPTION

Was this helpful?

  1. 第五章 视图

检查选项子句

Previous确保视图一致性Next管理

Last updated 5 years ago

Was this helpful?

本教程通过示例和清楚的说明帮助,了解WITH CHECK OPTION子句中LOCAL和CASCADED之间的差异。

在进行本教程之前,应该熟悉WITH CHECK OPTION子句。如果不是这样,可以来遵循确保视图的一致性。

LOCAL&CASCADED检查范围介绍

当使用WITH CHECK OPTION子句时,MySQL会通过视图检查正在更改的每个行,例如,,,以使其符合视图的定义。因为MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。

为了确定检查的范围,MySQL提供了两个选项:LOCAL和CASCADED。如果您没有在WITH CHECK OPTION子句中显式指定关键字,则MySQL默认使用CASCADED。

MySQL与CASCADC检查选项

要了解使用CASCADED CHECK OPTION的效果,请参阅下面的例子。

首先,一个名为t1的表,其中只有一个名称为:c的列,它的数据类型为int。

USE testdb;
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视图。在v2视图中添加一个WITH CASCADED CHECK OPTION子句。

CREATE OR REPLACE VIEW v2 
AS
    SELECT 
        c
    FROM
        v1 
WITH CASCADED CHECK OPTION;
INSERT INTO v2(c) VALUES (5);

MySQL发出以下错误消息:

Error Code: 1369. CHECK OPTION failed 'testdb.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 Code: 1369. CHECK OPTION failed 'testdb.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 LOCAL CHECK OPTION

下面将演示使用 WITH LOCAL CHECK OPTION 选项,使用上面相同的示例来查看差异。

首先,将v2视图更改为使用WITH LOCAL CHECK OPTIONS替代。

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视图中的WITH LOCAL CHECK OPTIONS选项没有检查v1视图的规则。 另外,请注意,在使用WITH CASCADED CHECK OPTION创建的v2视图示例中,此语句执行失败。

因此,如果视图使用WITH LOCAL CHECK OPTION,MySQL会检查WITH LOCAL CHECK OPTION和WITH CASCADED CHECK OPTION选项的视图规则。

与使用WITH CASCADED CHECK OPTION的视图不同,MySQL检查所有依赖视图的规则。

请注意,在MySQL 5.7.6之前,如果您使用带有WITH LOCAL CHECK OPTION的视图,MySQL只会检查当前视图的规则,并且不会检查底层视图的规则。

现在,通过v2视图在t1表中一个值为5的行。

上面插入语句看起来符合v3视图的定义,仍然执行失败。

参阅WITH CHECK OPTION子句教程
创建视图
插入
更新
删除
创建
插入
insert语句
img
img