日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

视图之二--视图中数据的更新

發布時間:2023/12/31 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 视图之二--视图中数据的更新 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  視圖不是表,視圖里面的數據是通過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

總結

以上是生活随笔為你收集整理的视图之二--视图中数据的更新的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。