视图不是表,视图里面的数据是通过sql语句去表中查询得到的。当表中的数据发送更改之后,视图里的数据也会发生相应的更改。所以我么一般有两种方式更新视图里面的数据:一是更新表中的数据,从而间接地更新视图中的数据;二是直接写sql已经更新视图。第一种是方式是一定可以的,第二中方法,能否可行取决于视图的具体结构。以下对第二种方法进行分析。

表结构如下:

 1 -- ----------------------------
 2 -- 学生表
 3 -- ----------------------------
 4 DROP TABLE IF EXISTS `student`;
 5 CREATE TABLE `student` (
 6   `id` varchar(255) NOT NULL,
 7   `name` varchar(255) NOT NULL,
 8   `age` int(11) DEFAULT NULL,
 9   `password` varchar(255) DEFAULT NULL,
10   PRIMARY KEY (`id`)
11 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
12
13 -- ----------------------------
14 -- 学生记录
15 -- ----------------------------
16 INSERT INTO `student` VALUES ('10001', '张三', '20', 'zhang123');
17 INSERT INTO `student` VALUES ('10002', '李四', '21', 'lisi123');
18 INSERT INTO `student` VALUES ('10003', '王五', '22', 'wang123');
19 -- ----------------------------
20 -- 学生成绩表
21 -- ----------------------------
22 DROP TABLE IF EXISTS `course`;
23 CREATE TABLE `course` (
24   `id` int(11) NOT NULL AUTO_INCREMENT,
25   `stu_no` varchar(255) NOT NULL,
26   `name` varchar(255) NOT NULL,
27   `score` int(11) NOT NULL,
28   PRIMARY KEY (`id`),
29   KEY `id_fk` (`stu_no`),
30   CONSTRAINT `id_fk` FOREIGN KEY (`stu_no`) REFERENCES `student` (`id`)
31 ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
32
33 -- ----------------------------
34 -- 学生成绩记录
35 -- ----------------------------
36 INSERT INTO `course` VALUES ('1', '10001', 'c++', '70');
37 INSERT INTO `course` VALUES ('2', '10001', 'java', '80');
38 INSERT INTO `course` VALUES ('3', '10001', 'lisp', '90');
39 INSERT INTO `course` VALUES ('4', '10002', 'c++', '75');
40 INSERT INTO `course` VALUES ('5', '10002', 'java', '80');
41 INSERT INTO `course` VALUES ('6', '10003', 'lisp', '91');
42 INSERT INTO `course` VALUES ('7', '10003', 'c++', '73');

一、视图只包含一张表的字段

  1、包含全部字段

    视图定义如下:

DROP VIEW IF EXISTS t_student;
CREATE VIEW t_student AS
SELECT * FROM student
WITH CHECK OPTION; 

  该视图是查询student表中的所有记录,进行更新的语句如下。

1 INSERT INTO `t_student` VALUES ('10004', '赵六', 22, 'wang123'); -- 插入时如果其他未设置的字段有默认值,可以插入,如果没有就报错
2 UPDATE t_student SET name='赵六2' where id='10004'; -- 更新可以
3 DELETE FROM t_student WHERE id = '10004'; -- 删除也可以

  UPDATE,INSERT,DELETE,都是可以的。INSERT的时候,如果之增加部分字段的值,如果未增加的字段没有默认值,且不能为空,则报错。

  2、带有id的部分字段

    视图定义如下:

CREATE OR REPLACE VIEW t_student2 AS
SELECT  id, name, age FROM student;

  该视图查询student表中的id,name,age字段的记录,进行更新的语句如下:

INSERT INTO t_student2 VALUES ( 4,'wangwu', 30); -- 插入时如果其他字段有默认值,可以插入,如果没有就报错
UPDATE t_student2 SET name='王五2' where id='4'; -- 更新可以
DELETE FROM t_student2 WHERE id = 4; -- 删除也可以

  由于student表中password字段默认值为null,所以INSERT的时候password没有赋值,也是可以增加的,UPDATE和DELETE也是成功的。

  3、不带有id的部分字段

    视图定义如下:

CREATE OR REPLACE VIEW t_student3 AS
SELECT  name, age  FROM student;

  该视图查询student表中的name,age字段的记录,进行更新的语句如下:

1 INSERT INTO t_student3 VALUES ('wangwu', 30); -- id 没有默认值,不能插入
2 UPDATE t_student3 SET age=40 where name='wangwu'; -- 更新可以
3 DELETE FROM t_student3 WHERE name = 'wangwu'; -- 删除可以

  INSERT的时候id没有默认值,所以失败。UPDATE和DELETE都成功。

二、视图包含两张表

  1、使用了group by分组查询

    查询所有人各科成绩

CREATE OR REPLACE VIEW t_student_score AS  -- 创建或者替换视图
SELECT s.name,sum(if(a.name = 'c++', score, 0)) as c,sum(if(a.name = 'java', score, 0)) as java,sum(if(a.name = 'lisp', score, 0)) as lisp
FROM course  AS a,student s
WHEREa.stu_no = s.id
GROUP BY a.stu_no;

    要执行的更新语句如下:

1 INSERT INTO t_student_score VALUES ('wangwu', 30, 40, 50); -- [Err] 1471 - The target table t_student_score of the INSERT is not INSERTable-into
2 UPDATE t_student_score SET c=40 where name='张三'; -- [Err] 1288 - The target table t_student_score of the UPDATE is not updatable
3 DELETE FROM t_student_score WHERE name = '张三'; -- [Err] 1288 - The target table t_student_score of the DELETE is not updatable
4  

  第一行INSERT,增加name,以及各科成绩。因为视图中的记录使用到了分组语句进行查询,索引无法进行增加,UPDATE和DELETE也一样会报错。

  2、没有使用group by等分组查询

    视图的定义如下:

CREATE OR REPLACE VIEW t_student_score2 AS
SELECT c.id AS id,c.stu_no AS stu_no,s.name AS stu_name,c.name  AS course_name,c.score AS score
FROM course AS c,student AS s
WHEREc.stu_no = s.id;

  查询student表的id,stu_no,name,course表的name,score。

  要进行的更新语句如下:

INSERT INTO t_student_score2 (id, stu_no, course_name, score) VALUES (8,'10001','c', 80);  -- 只能将结果插入单个表中,且插入的自动包含表中的所有不为空的字段(与其他表的关联字段设置的值,也必须是其他表中存在的)
UPDATE t_student_score2 SET score = 88 WHERE course_name = 'c'; -- 可以更新
DELETE FROM t_student_score2 WHERE course_name = 'c'; -- 不能删除

  对于多表可更新视图,如果是将其插入单个表中,INSERT能够工作。UPDATE也是可以的但不支持DELETE。

三、总结

  对于直接用sql语句去更新视图的的时候,有些时候是可以成功,有些时候不会。这 取决于视图的结构。

  视图内容是单表的时候,UPDATE,DELETE可以执行成功,对于INSERT如果未设值的字段都有默认值,或者是可以为空的字段的时候可以执行成功,否则会执行失败。对

  视图内容是两张或两张表以上的时候,如果使用了分组查询语句的时候,INSERT,updat,DELETE都会执行失败。如果没有使用分组查询语句的时候UPDATE是可以执行成功,DELETE会失败。INSERT只能将结构插入当个表中,所有插入的字段只能都在一张表中,而且未设置的字段都有默认值,或者是可以为空的字段的时候才可以执行成功,否则会执行失败。

转载于:https://www.cnblogs.com/always-online/p/3955921.html

视图之二--视图中数据的更新相关推荐

  1. vue中数据异步更新($nextTick)的问题

    在vue中数据向视图上进行更新的操作,是异步的 异步的就意味着,在代码中更改完数据之后,直接去访问页面中的元素中的内容,还是老数据 那么如何去解决这个问题呢? vue中提供了$nextTick方法: ...

  2. SQL中数据的更新查询

    (一)数据更新 首先先建立一个表再进行数据的更新 插入一个新学生元组 插入一个学生的信息 此处应注意所插入的值要与属性列对应,否则会出现数据类型不匹配的错误 插入选课记录 此处应注意是否有外键约束,如 ...

  3. mysql视图数据更新_怎么更新Mysql数据表视图中数据

    本篇文章主要给大家介绍mysql数据表中视图中数据的更新操作. 相关mysql视频教程推荐:<mysql教程> mysql数据表视图的定义及相关操作,如查询.修改.删除.添加等操作介绍,在 ...

  4. vue数组中数据变化但是视图没有更新解决方案

    vue数组中数据变化但是视图没有更新解决方案 参考文章: (1)vue数组中数据变化但是视图没有更新解决方案 (2)https://www.cnblogs.com/sufubo/p/6906261.h ...

  5. oracle怎么把数据跑进视图里,在Oracle中向视图中插入数据的方法

    在Oracle中向视图中插入数据的方法 插入视图的条件: 1.如果视图是基于一个基础表产生的,那么这就称为非连接视图,所有的非连接视图都是可以更新的,也就是说可以在该视图上进行,INSERT,UPDA ...

  6. 第14章_视图(创建视图、查看视图、更新视图的数据、修改、删除视图)

    第14章_视图 第14章_视图 1. 常见的数据库对象 2. 视图概述 2.1 为什么使用视图? 2.2 视图的理解 3. 创建视图 3.1 创建单表视图 3.2 创建多表联合视图 3.3 基于视图创 ...

  7. 视图中获取控制器中数据的方式

    在视图中获取控制器中数据的方式有两种: 一种是在控制器的操作中渲染视图时候分配模板数据,这种方式叫推送. 另外一种是在视图中手动获取控制器中的数据,包括控制器中的属性和方法及控制器id,通过$this ...

  8. mysql删除多表视图数据,【杂谈】怎样删除mysql数据表视图中数据

    本篇文章主要给人人引见 mysql数据表中视图数据的删除操纵. 经由之前关于mysql视图的相干学问引见,置信列位新手朋侪们对视图的定义及基础操纵都有更进一步的熟悉. 简朴的说,视图就是一些查询语句的 ...

  9. mysql视图中数据如何修改_怎么修改Mysql数据表中的视图

    本篇文章主要给大家介绍mysql数据表中怎么进行修改视图的操作. 关于mysql视图的基础知识,在之前的文章中也给大家详细介绍过了.这里我们再给大家先简单介绍下mysql视图. 通俗的说,视图是由SE ...

最新文章

  1. 安装.Net的痛苦经历!
  2. mxnet加载resnet,进行预测
  3. java8 lamda快速入门
  4. Qt工作笔记-Qt5新版信号与槽
  5. python 字符串首字母_如何将string(Python)中每个单词的首字母大写?
  6. Flash和HTML5那点事:后者拿什么取代Flash?
  7. 【学习笔记】ListView初识
  8. React传递参数的多种方式
  9. 一个人如果不学习,30岁就死了,活着的只是重复和应付
  10. error C2664: “StrCmpW”: 不能将参数 2 从“const char [12]”转换为“PCWSTR”
  11. 卷积神经网络CNN:Tensorflow实现(以及对卷积特征的可视化)
  12. ams1117封装尺寸
  13. MYSQL常见命令-Java学习之数据库学习
  14. 通过 Dockerfile 搭建标注工具 brat 的镜像
  15. 从核酸检测平台崩盘看性能工程的范围
  16. PS 色调——颜色运算
  17. java 森林_森林 - Minecraft Wiki,最详细的官方我的世界百科
  18. CSS3——2D变形(CSS3) transform
  19. Group by 分组详解
  20. Camel-学习笔记

热门文章

  1. 部署Lync For 移动设备 二
  2. 6/100. Invert Binary Tree
  3. Android 给按钮绑定事件
  4. Scrapy运行中常见网络相关错误
  5. 使用MyBatis Generator自动生成实体、mapper和dao层
  6. 网络流量监控分析工具 Ntopng 安装
  7. Solr in Action 翻译完成情况
  8. Google 图片下载工具
  9. KnowIME: A System to Construct a Knowledge Graph for Intelligent Manufacturing Equipment-学习笔记
  10. 学习响应式BootStrap来写融职教育网站,Bootsrtap第十天你的收获