我对MySQL中的check选项有几个问题:
1)我知道with check option
不会添加不满足用于定义视图的子选择查询中的WHERE
子句的记录,但如果未选择with check option
会发生什么?为什么要添加不满足WHERE
子句的行?
2)LOCAL
/ CASCADED
with check option
之间有什么区别?
答案 0 :(得分:4)
如果没有WITH CHECK OPTION
,则更新(INSERT
/ UPDATE
/ MERGE
/ DELETE
等)已查看的表将导致其基础基表更新,无论WHERE
的{{1}}子句如何(假设DBMS认为视图是可更新的)。如果VIEW
行INSERT
中的行不满足VIEW
子句,则刷新WHERE
新插入的行将不会在{{1}中显示}}。 VIEW
会阻止这种“奇怪”的情况发生,但除此之外还有更多。
考虑创建VIEW
以允许某个用户(用户组,应用程序等)仅查看表中行的子集,例如允许他们查看员工的数据,同时阻止他们查看执行员工的详细信息:撤消该用户对基表的读取权限,而是在视图上授予他们。 WITH CHECK OPTION
允许您对写入权限执行相同的操作,在这种情况下,如果它会创建执行员工行,则会阻止VIEW
查看视图。
可以使用类似的技术来强制执行“行级”约束,例如公司只能通过强制WITH CHECK OPTION
通过INSERT
INSERT
VIEW
只允许每个公司有一名员工。
如何定义“公司只能拥有一位总统”的条件
这是一个使用标准SQL的简单示例(没有FK等):
WHERE
第二个插入失败,因为它会使公司CREATE TABLE Employees
( company_id CHAR(8) NOT NULL,
employee CHAR(10) NOT NULL UNIQUE,
job_title VARCHAR(20) NOT NULL );
CREATE VIEW Presidents
AS
SELECT *
FROM Employees
WHERE job_title = 'president'
AND 1 >= ( SELECT COUNT(*)
FROM Employees e
WHERE e.job_title = 'president'
GROUP
BY e.company_id )
WITH CHECK OPTION;
INSERT INTO Employees VALUES ( 'Acme', '1', 'president' );
INSERT INTO Employees VALUES ( 'Acme', '2', 'president' );
的总统数大于1,因此查询的'子查询'部分将导致新的总统从视图的结果集中删除,该交易有效回滚。
答案 1 :(得分:3)
当您执行更新时,请考虑更多。当您对基表执行UPDATE,然后执行SELECT时,您刚刚更新的行仍然存在。
现在假设一个视图从基表中选择行,基于它们的ID介于2和5之间,并且用户运行这些查询:
SELECT * from View
UPDATE View set ID = ID + 3
SELECT * from View
现在,突然间,行已经消失了。