简单易懂解决SQL Server使用视图插入数据失败问题--WITH CHECK OPTION

前言

学习视图插入数据遇到问题,查阅博文,刚开始都没看懂,耗费了大量时间,有感于其他博友对这个问题的解释不太友好,只有懂了的才能看懂,不懂想看懂很困难,本着加深记忆的思想,开始撰写这篇博文。


准备

先提供表和插入的数据

--3.5 建立一个“学生”表Student
CREATE TABLE Student
(
	Sno CHAR(9) PRIMARY KEY,	--列级完整性约束条件,Sno是主码
	Sname CHAR(20) UNIQUE,		--Sname取唯一值
	Ssex CHAR(2),
	Sage SMALLINT,
	Sdept CHAR(20),
);

INSERT INTO Student VALUES('201215121','李勇','男',20,'CS')
INSERT INTO Student VALUES('201215122','刘晨','女',19,'CS')
INSERT INTO Student VALUES('201215123','王敏','女',18,'MA')
INSERT INTO Student VALUES('201215124','欧阳阳','女',20,'WX')
INSERT INTO Student VALUES('201215125','张立','男',19,'IS')
INSERT INTO Student VALUES('201215012','赵阳','男','20','IS')

SELECT * FROM Student

插入后的结果集:
在这里插入图片描述


创建视图

创建视图的代码:

CREATE VIEW IS_Student 
  AS SELECT Sno,Sname,Sage FROM Student 
  WHERE Sdept='IS' WITH CHECK OPTION -- 使用了WITH CHECK OPTION
GO
SELECT * FROM IS_Student
GO

视图的结果集:
在这里插入图片描述


插入数据失败

使用视图插入数据:

INSERT INTO IS_Student VALUES('201215129','赵新',20)

插入失败,失败结果是:
在这里插入图片描述

消息 550,级别 16,状态 1,第 1 行
试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。


失败原因分析

在这里插入图片描述
视图中加入了 WITH CHECK OPTION 后,以后对视图进行插入、修改和删除操作时,都会对语句的Sdept字段进行判断,如果Sdept=‘IS’,即满足条件,那么才可以进行该语句的操作。否则,即不满足Sdept=‘IS’,也就是说语句中指定的元组的Sdept的值不等于IS,那么就不能进行该操作。

比如该语句的插入,根本没有指定Sdept的值,只插入了数据(Sno,Sname,Sage),该元组的Sdept值是null,显然是不等于’IS’的,所以就会插入失败,就会显示上面的情况。


解决

那么怎么才能实现插入该元组呢?

('201215129','赵新',20)

将要用到的查询语句:

SELECT * FROM IS_Student -- 查询视图
SELECT * FROM Student    -- 查询表

多种解决方法


方法一:修改视图,去掉WITH CHECK OPTION
ALTER VIEW IS_Student 
AS 
SELECT Sno,Sname,Sage FROM Student WHERE Sdept='IS' --WITH CHECK OPTION
GO
INSERT INTO IS_Student VALUES('201215129','赵新',20)

下面的结果集中,第一张图片是视图的查询结果,第二张是表的查询结果。
结果集:
在这里插入图片描述
在这里插入图片描述


方法二:修改视图,增添Sdept属性列
ALTER VIEW IS_Student 
AS 
SELECT Sno,Sname,Sage,Sdept FROM Student WHERE Sdept='IS' WITH CHECK OPTION
GO
INSERT INTO INSERT INTO IS_Student VALUES('201215129','赵新',20,'IS')

这时元组中的属性Sdept=‘IS’,满足条件,可以插入成功。
结果集:
在这里插入图片描述
在这里插入图片描述


方法三:使用基本表插入
--INSERT INTO Student(Sno,Sname,Sage) VALUES ('201215129','赵新',20)
--或
INSERT INTO Student(Sno,Sname,Sage,Sdept) VALUES ('201215129','赵新',20,'IS')

在这里插入图片描述


后记

注1:该问题起始于《数据库系统概论》中的例3.85、例3.96。
注2:新人一枚,个人认为讲的还是比较透彻的,希望大家可以支持一下 ,点赞收藏啦!

  • 58
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
`WITH CHECK OPTION` 是 MySQL 中创建视图时的一个可选参数,它可以确保插入更新数据符合视图的过滤条件。如果插入更新数据不符合视图的过滤条件,则会触发错误。 具体来说,如果在视图上执行 `INSERT` 或 `UPDATE` 操作时,插入更新数据不符合视图的过滤条件,则会报错,阻止操作的继续进行。 下面是一个示例: 假设有一个 `students` 表,包含以下字段: - `id`:学生 ID - `name`:学生姓名 - `age`:学生年龄 - `gender`:学生性别 现在我们想要创建一个视图,只包含女生的信息。可以使用以下语句创建视图: ```sql CREATE VIEW female_students AS SELECT id, name, age, gender FROM students WHERE gender = '女' WITH CHECK OPTION; ``` 这个视图只包含 `students` 表中 `gender` 字段为 "女" 的记录。并且 `WITH CHECK OPTION` 确保插入更新数据都符合这个条件。 例如,如果我们尝试插入一个男生的信息到 `female_students` 视图中: ```sql INSERT INTO female_students (id, name, age, gender) VALUES (1, '张三', 20, '男'); ``` 则会报错,提示插入数据不符合视图的过滤条件。只有插入女生的信息才能成功。 需要注意的是,`WITH CHECK OPTION` 只能确保插入更新数据符合视图的过滤条件,但无法确保视图中的数据完全准确。如果 `students` 表中的一条记录的 `gender` 字段由 "女" 改为 "男",则这条记录仍然会出现在 `female_students` 视图中,直至被删除或更新

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值