• Mysql视图


    目录

    实践

    保证视图的数据一致性


    实践

    1.sql中的视图,其实是一个虚拟表,使用时动态检索查询数据,如何理解这个概念呢?我们先建立基础表,语句如下:

    1. DROP TABLE IF EXISTS `user_info`;
    2. CREATE TABLE `user_info` (
    3. `id` int(20) NOT NULL AUTO_INCREMENT,
    4. `arts_name` varchar(20) DEFAULT NULL,
    5. `user_name` varchar(20) DEFAULT NULL,
    6. `user_pwd` varchar(20) DEFAULT NULL,
    7. `rank_id` int(11) DEFAULT NULL,
    8. PRIMARY KEY (`id`),
    9. KEY `FK1gy0qoa8oxhd6lv5j41ubn0if` (`rank_id`),
    10. CONSTRAINT `FK1gy0qoa8oxhd6lv5j41ubn0if` FOREIGN KEY (`rank_id`) REFERENCES `user_rank` (`rank_id`)
    11. ) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8;
    12. -- ----------------------------
    13. -- Records of user_info
    14. -- ----------------------------
    15. INSERT INTO `user_info` VALUES ('1', '扫地僧', 'admin', '000000', '6');
    16. INSERT INTO `user_info` VALUES ('2', '降龙十八掌', '萧峰', '111111', '5');
    17. INSERT INTO `user_info` VALUES ('3', '六脉神剑', '段誉', '111111', '5');
    18. INSERT INTO `user_info` VALUES ('4', '小无相功', '虚竹', '222222', '5');
    19. INSERT INTO `user_info` VALUES ('5', '易筋经', '游坦之', '222222', '3');
    20. INSERT INTO `user_info` VALUES ('6', '斗转星移', '慕容复', '1111', '3');
    21. INSERT INTO `user_info` VALUES ('7', '化功大法', '丁春秋', '11111', '3');
    22. INSERT INTO `user_info` VALUES ('8', '天长地久不老长春功', '天山童姥', '222', '4');
    23. INSERT INTO `user_info` VALUES ('9', '天山六阳掌', '无崖子', '333', '4');
    24. INSERT INTO `user_info` VALUES ('11', '小无相功', '李秋水', '555', '3');
    25. INSERT INTO `user_info` VALUES ('12', '颜值', '王语嫣', '2222222', '1');
    26. INSERT INTO `user_info` VALUES ('13', '毒', '阿紫', '111111', '1');
    27. INSERT INTO `user_info` VALUES ('14', '易容术', '阿朱', '111111', '2');
    28. INSERT INTO `user_info` VALUES ('15', '一阳指', '段正淳', '111111', '2');
    29. INSERT INTO `user_info` VALUES ('16', '鳄嘴剪', '南海鳄神', '111111', '2');
    30. INSERT INTO `user_info` VALUES ('17', '轻功', '云中鹤', '111111', '1');
    31. INSERT INTO `user_info` VALUES ('20', '嘴炮', '钟万仇', '666666', '1');
    1. DROP TABLE IF EXISTS `user_rank`;
    2. CREATE TABLE `user_rank` (
    3. `rank_id` int(11) NOT NULL AUTO_INCREMENT,
    4. `user_rank_name` varchar(20) DEFAULT NULL,
    5. PRIMARY KEY (`rank_id`)
    6. ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
    7. -- ----------------------------
    8. -- Records of user_rank
    9. -- ----------------------------
    10. INSERT INTO `user_rank` VALUES ('1', '青铜');
    11. INSERT INTO `user_rank` VALUES ('2', '白银');
    12. INSERT INTO `user_rank` VALUES ('3', '黄金');
    13. INSERT INTO `user_rank` VALUES ('4', '铂金');
    14. INSERT INTO `user_rank` VALUES ('5', '钻石');
    15. INSERT INTO `user_rank` VALUES ('6', '王者');

    2.建表完毕,我们利用create view as select xxx ——>在mysql中建立视图

    1. CREATE VIEW view_name
    2. AS
    3. SELECT * FROM table_name ;
    4. >>>>>示例<<<<<
    5. CREATE VIEW userView
    6. AS
    7. SELECT * FROM user_info ; //创建视图
    8. SELECT * FROM userView; //查询视图
    9. UPDATE userView SET user_pwd='admin' WHERE user_name='admin'; //使用视图更新底层数据

    视图的数据和表中的数据是不一致的情况

    如果先建立视图,然后修改对应表中数据,视图是不会改变的

    1. CREATE VIEW userView2
    2. AS
    3. SELECT * FROM user_info WHERE id<10
    4. SELECT * FROM userView2;
    5. INSERT INTO `user_info` VALUES ('22', '梅剑', '333', 'new', '1');

    保证视图的数据一致性

    创建了一个只展示1-10的视图数据,向底层user_info表插入一条数据,在该userView2中是看不到的,所以实际应用中可以在创建或修改视图时使用WITH CHECK OPTION(确保视图的一致性),使用了WITH CHECK OPTION,用户只能显示或更新通过视图可见的数据,比如:

    CREATE VIEW itema_view AS SELECT * FROM tb_item WITH CHECK OPTION;


     

    总结:

    1)简单化,数据所见即所得(比如5张表关联,但是查询只需要每一张表中的1-2个字段,建立视图最合适)

    2)实现访问性控制,更加安全(用户只能查询或修改Where限制的数据,所以可以隐蔽真实表中的数据结构)

    缺点:

     1)性能相对较差(如果视图是基于其他视图创建,查询会相当慢)

    2)修改不便

    要创建可更新视图,定义视图的SELECT语句不能包含以下任何元素:
    ➢聚合函数;
    distinct 子句;
    ➢group by 子句;
    ➢having 子句;
    union 和 union all 子句;
    ➢外连接
    注意:不建议使用基于多表创建的视图进行更新操作。
     

    1. >>>>>查看视图<<<<<
    2. SHOW TABLE STATUS [LIKE 'view_name%'] ; (查看基本信息)
    3. DESC view_name ; 或者 DESCRIBE view_name; (查看基本信息)
    4. SHOW CREATE VIEW view_name ; (查看详细信息)
    5. SELECT * FROM information_schema.views; (查看数据库中所有视图详细信息)
    6. >>>>>删除视图<<<<<
    7. DROP VIEW IF EXISTS view_name ;

  • 相关阅读:
    Servlet之动态绑定应用(成绩录入)
    Global Mapper 导出图层功能的妙用(重采样、设置文件类型、切片、按掩膜提取or裁剪……)
    typescript-TS中的兼容性(十二)
    java 实现适配器模式
    代码报错:There‘s no Qt version assigned to project Project.vcxproj
    西部数据硬盘查询
    git常用操作总结
    技术管理进阶——成长加速的秘密
    如何验证高压放大器的性能好坏呢
    scrapy返回400
  • 原文地址:https://blog.csdn.net/weixin_57128596/article/details/127550293