mysql 一致性视图_MySQL with check option确保视图一致性

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

WITH CHECK OPTION子句简介

有时候,创建一个视图来显示表的部分数据。然而,简单视图是可更新的,因此可以更新通过视图不可见的数据。此更新使视图不一致。为了确保视图的一致性,在创建或修改视图时使用WITH CHECK OPTION子句。

下面说明了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子句示例

首先,我们根据employees表创建一个名为vps的视图,以显示其职位为VP的员工,例如VP Marketing和 VP Sales。

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;

执行上面查询语句,得到以下结果 -

mysql> SELECT * FROM vps;

+----------------+----------+-----------+--------------+-----------+----------------------+------------+-----------+

| employeeNumber | lastname | firstname | jobtitle | extension | email | officeCode | reportsTo |

+----------------+----------+-----------+--------------+-----------+----------------------+------------+-----------+

| 1056 | Hill | Mary | VP Sales | x4611 | mary.hill@yiibai.com | 1 | 1002 |

| 1076 | Firrelli | Jeff | VP Marketing | x9273 | jfirrelli@yiibai.com | 1 | 1002 |

+----------------+----------+-----------+--------------+-----------+----------------------+------------+-----------+

2 rows in set

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

然后,我们通过vps视图将一行员工数据信息插入。

INSERT INTO vps(employeeNumber,firstname,lastname,jobtitle,extension,email,officeCode,reportsTo)

values(1703,'Lily','Bush','IT Manager','x9111','lilybush@yiiibai.com',1,1002);

请注意,新创建的员工通过vps视图不可见,因为她的职位是IT经理,而不是VP。使用以下SELECT语句来验证它。

SELECT * FROM employees WHERE employeeNumber=1703;

执行上面语句,得到以下结果 -

+----------------+-----------+-----------+-----------+-----------------------+------------+-----------+----------------------+

| employeeNumber | lastName | firstName | extension | email | officeCode | reportsTo | jobTitle |

+----------------+-----------+-----------+-----------+-----------------------+------------+-----------+----------------------+

| 1703 | Bush | Lily | x9111 | lilybush@yiiibai.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 |

但这可能不是我们想要的,因为通过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','Minsu','IT Staff','x9112','johnminsu@yiibai.com',1,1703);

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

Error Code: 1369 - CHECK OPTION failed 'yiibaidb.vps'

最后,我们通过vps视图将一个职位为SVP Marketing的员工插入employees表,看看MySQL是否允许这样做。

INSERT INTO vps(employeeNumber,firstname,lastname,jobtitle,extension,email,officeCode,reportsTo)

VALUES(1704,'John','Minsu','SVP Marketing','x9112','johnminsu@classicmodelcars.com',1,1076);

MySQL发出1行受影响(Query OK, 1 row affected)。

可以通过根据vps视图查询数据来再次验证插入操作。

SELECT * FROM vps;

如上查询结果所示,它的确按预期工作了。

mysql> SELECT * FROM vps;

+----------------+----------+-----------+---------------+-----------+--------------------------------+------------+-----------+

| employeeNumber | lastname | firstname | jobtitle | extension | email | officeCode | reportsTo |

+----------------+----------+-----------+---------------+-----------+--------------------------------+------------+-----------+

| 1056 | Hill | Mary | VP Sales | x4611 | mary.hill@yiibai.com | 1 | 1002 |

| 1076 | Firrelli | Jeff | VP Marketing | x9273 | jfirrelli@yiibai.com | 1 | 1002 |

| 1704 | Minsu | John | SVP Marketing | x9112 | johnminsu@classicmodelcars.com | 1 | 1076 |

+----------------+----------+-----------+---------------+-----------+--------------------------------+------------+-----------+

3 rows in set

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

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值