视图中with check option的作用是什么?

时间:2021-05-22 16:02:43
我创建一个视图:
create view IS_student
as
select sno,sname,sage
from student
where sdept='IS'
with check option;
加上了with check option;后,不能执行插入操作:

insert into is_student
values('95100','李娜',12)

什么原因?不加上with check option则可以!

15 个解决方案

#1


with check option可以这么解释:通过视图进行的修改,必须也能通过该视图看到修改后的结果。比如你insert,那么加的这条记录在刷新视图后必须可以看到;如果修改,修改完的结果也必须能通过该视图看到;如果删除,当然只能删除视图里有显示的记录。

--->而你只是查询出sdept='is'的纪录,你插入的根本不符合sdept='is'呀,所以就不行

#2


是不是其他的数据库可以那?在数据库原理书中说,当执行:
insert into is_student
values('95100','李娜',12)时候,相当与执行:

insert into student(sno,sname,sage,sdept)
values('95100','李娜',12,'IS')

#3


不行!

除非你设置表student的sdept字段的default值为'is',这样你保留view:with check option
然后插入insert into is_student
values('95100','李娜',12)就默认sdetp等于is,就没有问题啦

#4


好端端的何必Insert到视图拉!! 

视图就让它作查询就是了嘛!!

#5


问:with check option是什么??

答:百度,搜索"with check option"

#6


意思就是说在执行Insert的时候,默认情况下sdept是'IS',才满足with check option是吗?

DBMS不会自动加上Sdept='IS'吗?因为在视图IS_student是选择所有是‘IS’的学生的啊!

#7


那么你插入这个视图就必须是插入后可以在视图秀出来的,但是你插入后又不能指定!

就是你认为那样!

DBMS不会自动加上Sdept='IS'吗?---〉不会!

#8


十分感谢!

最终还是有一点不清楚,就是with check option,到底是在检查什么??

#9


with check option可以这么解释:通过视图进行的修改,必须也能通过该视图看到修改后的结果。比如你insert,那么加的这条记录在刷新视图后必须可以看到;如果修改,修改完的结果也必须能通过该视图看到;如果删除,当然只能删除视图里有显示的记录。
--->就是如此作用:-)

#10


奇怪的是,当执行
delete
from is_student
where sno='95029';的时候却可以

为什么删除又和with check option没有关系了那?

#11


可是我都是在执行SQL语句,而不是可视化的修改,又怎么知道会看到修改后有结果那?

总是觉得有些怪怪的,不知道问题的实质是什么!

#12


谢谢一勺抹茶,真实很感谢!

#13


默认情况下,由于行通过视图进行添加或更新,当其不再符合定义视图的查询的条件时,它们即从视图范围中消失。例如,可创建一个查询,从而定义一个视图以在表中检索所有员工薪水低于 $30,000 的行。如果该员工的薪水涨到了 $32,000,则查询视图时该特定员工将不再出现,因其薪水不符合视图所设的标准。但是,WITH CHECK OPTION 子句强制所有数据修改语句均根据视图执行,以符合定义视图的 SELECT 语句中所设的条件。如果使用该子句,修改行时需考虑到不让它在修改完后从视图中消失。任何可能导致行消失的修改都会被取消,并显示错误信息。

#14


WITH CHECK OPTION 子句强制所有数据修改语句均根据视图执行,以符合定义视图的 SELECT 语句中所设的条件??

什么叫均根据视图进行?

如果要是删除记录的话,肯定要从视图中消失,不是不允许删除吧!

#15


很明显,你设置在CHECK约束

#1


with check option可以这么解释:通过视图进行的修改,必须也能通过该视图看到修改后的结果。比如你insert,那么加的这条记录在刷新视图后必须可以看到;如果修改,修改完的结果也必须能通过该视图看到;如果删除,当然只能删除视图里有显示的记录。

--->而你只是查询出sdept='is'的纪录,你插入的根本不符合sdept='is'呀,所以就不行

#2


是不是其他的数据库可以那?在数据库原理书中说,当执行:
insert into is_student
values('95100','李娜',12)时候,相当与执行:

insert into student(sno,sname,sage,sdept)
values('95100','李娜',12,'IS')

#3


不行!

除非你设置表student的sdept字段的default值为'is',这样你保留view:with check option
然后插入insert into is_student
values('95100','李娜',12)就默认sdetp等于is,就没有问题啦

#4


好端端的何必Insert到视图拉!! 

视图就让它作查询就是了嘛!!

#5


问:with check option是什么??

答:百度,搜索"with check option"

#6


意思就是说在执行Insert的时候,默认情况下sdept是'IS',才满足with check option是吗?

DBMS不会自动加上Sdept='IS'吗?因为在视图IS_student是选择所有是‘IS’的学生的啊!

#7


那么你插入这个视图就必须是插入后可以在视图秀出来的,但是你插入后又不能指定!

就是你认为那样!

DBMS不会自动加上Sdept='IS'吗?---〉不会!

#8


十分感谢!

最终还是有一点不清楚,就是with check option,到底是在检查什么??

#9


with check option可以这么解释:通过视图进行的修改,必须也能通过该视图看到修改后的结果。比如你insert,那么加的这条记录在刷新视图后必须可以看到;如果修改,修改完的结果也必须能通过该视图看到;如果删除,当然只能删除视图里有显示的记录。
--->就是如此作用:-)

#10


奇怪的是,当执行
delete
from is_student
where sno='95029';的时候却可以

为什么删除又和with check option没有关系了那?

#11


可是我都是在执行SQL语句,而不是可视化的修改,又怎么知道会看到修改后有结果那?

总是觉得有些怪怪的,不知道问题的实质是什么!

#12


谢谢一勺抹茶,真实很感谢!

#13


默认情况下,由于行通过视图进行添加或更新,当其不再符合定义视图的查询的条件时,它们即从视图范围中消失。例如,可创建一个查询,从而定义一个视图以在表中检索所有员工薪水低于 $30,000 的行。如果该员工的薪水涨到了 $32,000,则查询视图时该特定员工将不再出现,因其薪水不符合视图所设的标准。但是,WITH CHECK OPTION 子句强制所有数据修改语句均根据视图执行,以符合定义视图的 SELECT 语句中所设的条件。如果使用该子句,修改行时需考虑到不让它在修改完后从视图中消失。任何可能导致行消失的修改都会被取消,并显示错误信息。

#14


WITH CHECK OPTION 子句强制所有数据修改语句均根据视图执行,以符合定义视图的 SELECT 语句中所设的条件??

什么叫均根据视图进行?

如果要是删除记录的话,肯定要从视图中消失,不是不允许删除吧!

#15


很明显,你设置在CHECK约束