MySQL视图和WITH CHECK OPTION子句

时间:2019-11-20 08:52:13  来源:igfitidea点击:

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

MySQL View和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的视图,以显示其职务为副总裁(例如销售副总裁,营销副总裁)的员工。

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

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

SELECT * FROM vps;

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

然后,通过vps视图将行插入到employee表中。

INSERT INTO vps(
    employeeNumber,
    firstName,
    lastName,
    jobTitle,
    extension,
    email,
    officeCode,
    reportsTo
) 
VALUES(
    1703,
    'Lily',
    'Bush',
    'IT Manager',
    'x9111',
    '[email protected]',
    1,
    1002
);

请注意,新创建的员工在vps视图中不可见,因为她的职务是IT经理,而不是副总裁。
您可以使用以下SELECT语句进行验证。

SELECT 
   * 
FROM 
   employees
ORDER BY 
   employeeNumber DESC;

这可能不是我们想要的,因为我们只想通过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;

请注意CREATE OR REPLACE语句末尾的WITH CHECK OPTION。

之后,通过vps视图将一行插入employees表:

INSERT INTO vps(employeeNumber,firstname,lastname,jobtitle,extension,email,officeCode,reportsTo)
VALUES(1704,'John','Smith','IT Staff','x9112','[email protected]',1,1703);

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

Error Code: 1369. CHECK OPTION failed 'classicmodels.vps'

最后,通过vps视图将职位为SVP Marketing的员工插入employee表中,以查看是否允许该员工。

INSERT INTO vps(employeeNumber,firstname,lastname,jobtitle,extension,email,officeCode,reportsTo)
VALUES(1704,'John','Smith','SVP Marketing','x9112','[email protected]',1,1076);

MySQL发出消息:

1 rows(s) affected.

您可以通过从vps视图查询数据来验证插入。

SELECT * FROM vps;

它按预期工作。

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