• 更新view是可以update到表的


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

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

      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都成功。

  • 相关阅读:
    AtomicReference与volatile的区别
    深度剖析ConcurrentHashMap(转)
    ConcurrentHashMap原理分析
    Java Stack源码分析
    Fail-Fast机制详解
    TreeSet源码分析
    状态(State)模式
    原型(Prototype)模式
    职责连模式
    观察者模式(Observer)
  • 原文地址:https://www.cnblogs.com/kakaisgood/p/11338795.html
Copyright © 2020-2023  润新知