可以通过数据库视图可以增删改吗?——浅谈with check option的作用

本文介绍了在数据库中如何使用WITH CHECK OPTION来约束通过视图进行的数据更新行为,包括插入、更新和删除操作。并详细说明了不同情况下视图的可更新性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先自定义一个table   名为 :Star

 

 

 

 

 

 

 

 

先定义视图找出所有张姓明星:

create view  IS_Star
as  
select * from Star  
where  name  like '张%'   
with check option 

再使用视图获取张姓明星情况:

sql代码   收藏代码
  1. select * from IS_Star  

 此时,with  check option 约束条件是对视图里面所有的name 首字符必须是以 ‘张’字打头。不管是修改前还是修改后都必须遵从此规则。否则出错。

 比如

sql代码   收藏代码
  1. update IS_Star  set name='刘家辉'  where name='张家辉  

 这是不可以的。

 而

sql代码   收藏代码
  1. update IS_test set name='张家界'  where name='张家辉'  

 是可以。前后姓没有变。满足where 后面的约束条件。

而如果在选取视图的时候没有使用 with check option 约束语句的话,那么,是可以改的。也就是张家辉既可以变成刘家辉也可以变成张家界

 另外如果选取年龄大于四十的明星

create view IS_Star1   
as  
select * from Star where age>40  
with check option  
sql代码   收藏代码
  1. update  IS_Star1 set age=age-6 where name='张家辉'  

   这样会报错 服务器: 消息 550,级别 16,状态 1,行 1
试图进行的插入或更新已失败。原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束的条件。
语句已终止。

  而如果是

sql代码   收藏代码
  1. update  IS_Star1 set age=age-4 where name='张家辉'  

  那么则正确插入。这里的意思是在视图里面的所有信息,只要在创建视图的时候加了with check option  那么。则不允许它的那个属性值变为不属于 where 后面条件的情况 

  如果不加with check option 那么则值可以任意变。 

 小结:

1.对于update,有with check option,要保证update后,数据要被视图查询出来 
2.对于delete,有无with check option都一样 
4.对于insert,有with check option,要保证insert后,数据要被视图查询出来 
5.对于没有where 子句的视图,使用with check option是多余的

转载自:http://1035054540-qq-com.iteye.com/blog/1499430

要通过视图更新基本表数据,必须保证视图是可更新视图,即可以在INSET、UPDATE或DELETE等语句当中使用它们。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。
如果视图包含下述结构中的任何一种,那么它就是不可更新的:
(1)聚合函数;
(2)DISTINCT关键字;
(3)GROUP BY子句;
(4)ORDER BY子句;
(5)HAVING子句;
(6)UNION运算符;
(7)位于选择列表中的子查询;
(8)FROM子句中包含多个表;
(9)SELECT语句中引用了不可更新视图;
(10)WHERE子句中的子查询,引用FROM子句中的表;
(11)ALGORITHM 选项指定为TEMPTABLE(使用临时表总会使视图成为不可更新的)。
1、插入数据
使用INSERT语句通过视图向基本表插入数据
例: 创建视图CS_XS,视图中包含计算机专业的学生信息,并向CS_XS视图中插入一条记录:('081255','李牧','计算机',1,'1990-10-21',50,NULL,NULL)。
首先创建视图CS_XS:(以下的删除、修改都是用该表)

CREATE OR REPLACE VIEW CS_XS
      AS  SELECT* FROM XS
      WHERE 专业名 = '计算机'  WITH CHECK OPTION;
注意:在创建视图的时候加上WITH CHECK OPTION子句,是因为WITH CHECK OPTION子句会在更新数据的时候检查新数据是否符合视图定义中WHERE子句的条件。WITH CHECKOPTION子句只能和可更新视图一起使用。
接下来插入记录:
INSERT INTO CS_XS
     VALUES('081255', '李牧', '计算机', 1, '1990-10-14',50, NULL, NULL);
注意:这里插入记录时专业名只能为“计算机”。
这时,使用SELECT语句查询CS_XS视图和基本表XS,就可发现XS表中该记录已经被添加。
当视图所依赖的基本表有多个时,不能向该视图插入数据,因为这将会影响多个基本表。例如,不能向视图CS_KC插入数据,因为CS_KC依赖两个基本表:XS和XS_KC。
对INSERT语句还有一个限制:SELECT语句中必须包含FROM子句中指定表的所有不能为空的列。例如,若CS_XS视图定义的时候不加上“姓名”字段,则插入数据的时候会出错。

2、修改数据
使用UPDATE语句可以通过视图修改基本表的数据
例: 将CS_XS视图中所有学生的总学分增加8。

UPDATE CS_XS SET 总学分 = 总学分+ 8;
该语句实际上是将CS_XS视图所依赖的基本表XS中所有记录的总学分字段值在原来基础上增加8。
若一个视图依赖于多个基本表,则一次修改该视图只能变动一个基本表的数据。
例: 将CS_KC视图中学号为081101的学生的101课程成绩改为90。
UPDATE CS_KC  SET 成绩=90
    WHERE 学号='081101' AND 课程号='101';
本例中,视图CS_KC依赖于两个基本表:XS和XS_KC,对CS_KC视图的一次修改只能改变学号(源于XS表)或者课程号和成绩(源于XS_KC表)。
以下的修改是错误的:
UPDATE CS_KC  SET 学号='081120',课程号='208' WHERE 成绩=90;
3、删除数据
使用DELETE语句可以通过视图删除基本表的数据
例: 删除CS_XS中女同学的记录。
DELETE FROM CS_XS  WHERE 性别 = 0;
注意:对依赖于多个基本表的视图,不能使用DELETE语句。例如,不能通过对CS_KC视图执行DELETE语句而删除与之相关的基本表XS及XS_KC表的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值