轻松上手,快乐学习!

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确保视图一致性


简介:在本教程中,您将学习如何使用WITH CHECK OPTION子句确保视图的一致性。


WITH CHECK OPTION 子句简介

有时,您创建一个视图以仅显示表的部分数据。但是,简单视图是可更新的,因此可以更新通过视图不可见的数据。此更新使视图不一致。要确保视图的一致性,请WITH CHECK OPTION创建或修改视图时使用子句。

WITH CHECK OPTION子句是CREATE VIEW声明的可选部分。WITH CHECK OPTION子句阻止您  更新插入通过视图不可见的行。换句话说,每当您通过视图更新或插入基表的一行时,MySQL都会确保插入或更新操作符合视图的定义。

以下说明了WITH CHECK OPTION子句的语法。

CREATE OR REPLACE VIEW view_name 
AS
  select_statement
  WITH CHECK OPTION;

请注意,您将分号(;)放在WITH CHECK OPTION子句的末尾,而不是在定义视图的SELECT语句的末尾。

我们来看一个使用WITH CHECK OPTION子句的例子。


MySQL WITH CHECK OPTION子句示例

首先,我们创建一个vps基于employees表命名的视图,以揭示其职称为VP的员工,例如,销售副总裁,营销副总裁。

CREATE OR REPLACE VIEW vps AS
    SELECT 
        employeeNumber,
        lastname,
        firstname,
        jobtitle,
        extension,
        email,
        officeCode,
        reportsTo
    FROM
        employees
    WHERE
        jobTitle LIKE '%VP%';

接下来,我们vps使用以下语句从视图中查询数据:

SELECT 
    *
FROM
    vps;
+----------------+-----------+-----------+--------------+-----------+----------------------+------------+-----------+
| employeeNumber | lastname  | firstname | jobtitle     | extension | email                | officeCode | reportsTo |
+----------------+-----------+-----------+--------------+-----------+----------------------+------------+-----------+
|           1056 | Patterson | Mary      | VP Sales     | x4611     | mpatterso@yiibai.com | 1          |      1002 |
|           1076 | Firrelli  | Jeff      | VP Marketing | x9273     | jfirrelli@yiibai.com | 1          |      1002 |
+----------------+-----------+-----------+--------------+-----------+----------------------+------------+-----------+
2 rows in set (0.00 sec)

因为它vps 是一个简单的视图因此它是可更新的。

然后,我们插入一行employees通过vps视图。

INSERT INTO vps(employeeNumber,firstname,lastname,jobtitle,extension,email,officeCode,reportsTo)
values(1703,'Lily','Bush','IT Manager','x9111','lilybush@classicmodelcars.com',1,1002);

注意:新创建的员工在vps视图中不可见,因为她的职位是IT Manager,而不是VP。您可以使用以下SELECT语句对其进行验证。

SELECT 
    *
FROM
    employees
ORDER BY 
    employeeNumber DESC;
+----------------+-----------+-----------+-----------+-------------------------------+------------+-----------+----------------------+
| employeeNumber | lastName  | firstName | extension | email                         | officeCode | reportsTo | jobTitle             |
+----------------+-----------+-----------+-----------+-------------------------------+------------+-----------+----------------------+
|           1703 | Bush      | Lily      | x9111     | lilybush@classicmodelcars.com | 1          |      1002 | IT Manager           |
|           1702 | Gerard    | Martin    | x2312     | mgerard@gmail.com             | 4          |      1102 | Sales Rep            |
|           1625 | Kato      | Yoshimi   | x102      | ykato@gmail.com               | 5          |      1621 | Sales Rep            |
|           1621 | Nishi     | Mami      | x101      | mnishi@gmail.com              | 5          |      1056 | Sales Rep            |
|           1619 | King      | Tom       | x103      | tking@gmail.com               | 6          |      1088 | Sales Rep            |
...

这可能不是我们想要的,因为我们只通过vps视图公开VP员工,而不是其他员工。

要确保视图的一致性,以便用户只能显示或更新通过视图可见的数据,请WITH CHECK OPTION在创建或修改视图时使用。

让我们修改视图以包含WITH CHECK OPTION

CREATE OR REPLACE VIEW vps AS
    SELECT 
        employeeNumber,
        lastname,
        firstname,
        jobtitle,
        extension,
        email,
        officeCode,
        reportsTo
    FROM
        employees
    WHERE
        jobTitle LIKE '%VP%' 
WITH CHECK OPTION;

注意声明的WITH CHECK OPTIONCREATE OR REPLACE末尾。

之后,我们通过视图在employees表中插入一行vps,如下所示:

INSERT INTO vps(employeeNumber,firstname,lastname,jobtitle,extension,email,officeCode,reportsTo)
VALUES(1704,'John','Smith','IT Staff','x9112','johnsmith@classicmodelcars.com',1,1703);

这次,MySQL拒绝了插入并发出以下错误消息:

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

最后,我们通过视图插入一个职位名称SVP Marketingemployees表中的员工,vps看看MySQL是否允许我们这样做。

INSERT INTO vps(employeeNumber,firstname,lastname,jobtitle,extension,email,officeCode,reportsTo)
VALUES(1704,'John','Smith','SVP Marketing','x9112','johnsmith@classicmodelcars.com',1,1076);

MySQL发布了1行受影响。

我们可以通过vps查看视图中的数据来再次验证插入操作。

SELECT 
    *
FROM
    vps;
+----------------+-----------+-----------+---------------+-----------+--------------------------------+------------+-----------+
| employeeNumber | lastname  | firstname | jobtitle      | extension | email                          | officeCode | reportsTo |
+----------------+-----------+-----------+---------------+-----------+--------------------------------+------------+-----------+
|           1056 | Patterson | Mary      | VP Sales      | x4611     | mpatterso@yiibai.com           | 1          |      1002 |
|           1076 | Firrelli  | Jeff      | VP Marketing  | x9273     | jfirrelli@yiibai.com           | 1          |      1002 |
|           1704 | Smith     | John      | SVP Marketing | x9112     | johnsmith@classicmodelcars.com | 1          |      1076 |
+----------------+-----------+-----------+---------------+-----------+--------------------------------+------------+-----------+
3 rows in set (0.00 sec)

它按预期工作。

在本教程中,您学习了如何使用WITH CHECK OPTION子句来确保视图的一致性。