某些视图是可更新的。也就是说,可以在诸如UPDATE
、DELETE
或INSERT
等语句中使用它们,以更新基表的内容。对于可更新的视图
通过视图修改基本表数据
,在视图中的行和基表中的行之间必须具有一对一的关系
[视图列和基表列斯对应关系co1,co2,如果试图列是通过通过类似(co1*co2) as co3的方式产生的是不可更新的,也就是说co1和co2可更新,co3不可更新]
。还有一些特定的其他结构,这类结构会使得视图不可更新。更具体地讲,如果视图包含下述结构中的任何一种,那么它就是不可更新的:
·
聚合函数(SUM()
,
MIN()
,
MAX()
,
COUNT()
等)。
·
DISTINCT
·
GROUP BY
·
HAVING
·
UNION
或UNION ALL
·
位于选择列表中的子查询
·
Join
·
FROM
子句中的不可更新视图
·
WHERE
子句中的子查询,引用FROM
子句中的表。
·
仅引用文字值(在该情况下,没有要更新的基本表)。
·
ALGORITHM = TEMPTABLE
(使用临时表总会使视图成为不可更新的)
。
关于可插入性(可用INSERT
语句更新)
,如果它也满足关于视图列的下述额外要求,可更新的视图也是可插入的:
·
不得有重复的视图列名称。
·
视图必须包含没有默认值的基表中的所有列。
·
视图列必须是简单的列引用而不是导出列
。导出列不是简单的列引用,而是从表达式导出的。下面给出了一些导出列示例:
·
3.14159
·
col1 + 3
·
UPPER(col2)
·
col3 / col4
·
(subquery
) 子查询
混合了简单列引用和导出列的视图是不可插入的,但是,如果仅更新非导出列,视图是可更新的。考虑下述视图:
CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;
该视图是不可插入的,这是因为col2
是从表达式导出的。但是,如果更新时不更新col2
,它是可更新的。这类更新是允许的:
UPDATE v SET col1 = 0;
下述更新是不允许的,原因在于,它试图更新导出列:
UPDATE v SET col2 = 0;
在某些情况下,能够更新多表视图,假定它能使用MERGE
算法进行处理。为此,视图必须使用内部联合(而不是外部联合或
UNION
有待验证
)。
此外,仅能更新视图定义中的单个表,因此,SET
子句必须仅命名视图中某一表的列。即使从理论上讲也是可更新的,不允许使用UNION ALL
的视图,这是因为,在实施中将使用临时表
来处理它们
。
对于多表可更新视图,如果是将其插入单个表中,INSERT
能够工作。
不支持DELETE
。
对于可更新视图,可给定WITH CHECK OPTION
子句来防止插入或更新行,除非作用在行上的select_statement
中的WHERE
子句为“真”。
在关于可更新视图的WITH CHECK OPTION
子句中,当视图是根据另一个视图定义的时,LOCAL
和CASCADED
关键字
决定了检查测试的范围。LOCAL
关键字对CHECK OPTION
进行了限制,使其仅作用在定义的视图上,CASCADED
会对将进行评估的基表进行检查。如果未给定任一关键字,默认值为CASCADED
。
请考虑下述表和视图集合的定义:
mysql> CREATE TABLE t1 (a INT);
mysql> CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2
-> WITH CHECK OPTION;
mysql> CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0
-> WITH LOCAL CHECK OPTION;
mysql> CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0
-> WITH CASCADED CHECK OPTION;
这里,视图v2
和v3
是根据另一视图v1
定义的
。v2
具有LOCAL
检查选项,因此,仅会针对v2
检查对插入项进行测试。v3
具有CASCADED
检查选项,因此,不仅会针对它自己的检查对插入项进行测试,
也会针对基本视图的检查对插入项进行测试
。在下面的语句中,介绍了这些差异:
ql> INSERT INTO v2 VALUES (2);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO v3 VALUES (2);
ERROR 1369 (HY000): CHECK OPTION failed 'test.v3'
视图的可更新性可能会受到系统变量updatable_views_with_limit
的值的影响。
请参见5.3.3节,“服务器系统变量”
。
INFORMATION_SCHEMA
包含1
个VIEWS
表,从该表可获取关于视图对象的信息
。请参见23.1.15节,“INFORMATION_SCHEMA VIEWS表”
。
相关推荐
Mysql视图工具(Navicat for MySQL)
mysql视图简介.pdf,本人自己精心的整理搜集,请大家看下,内容虽然来自其他网站或者网友,但是资源来的很不容易,谢谢大家的下载传看。
MySql视图顺序整理工具,只要把Navicat 中的视图sql 单独保存用这个程序就自动整理好!!快速安装部署。
EMS SQL Management Studio is a complete solution for database administration and development. SQL Studio unites all must-have components that focus on the most critical database management tasks in ...
文件中记录了一些常用的navicat查询的快捷键,很方面大家操作这个工具,记录不完善还望莫见怪!!!
数据库mysql的各种查询语句check的完整性约束 mysql多表查询+ mysql视图 mysql数据库管理+ select语句+ 创建表+ 多表链接 分类汇总 外连接和子查询 完整性约束等等
mysql视图用户管理.pdf
MySQL视图及存储过程学习笔记
2015 Oracle 技术嘉年华(OTN)分会场11李海翔 - MySQL视图优化
mysql视图用户管理.docxmysql视图用户管理.docx
mysql视图用户管理.doc
第10章MySQL视图.docx
经过视频学习和总结出来的
主要介绍了Django框架使用mysql视图操作,结合实例形式分析了mysql视图的创建、查看以及Django框架使用mysql视图相关操作技巧,需要的朋友可以参考下
本文实例讲述了mysql视图原理与用法。分享给大家供大家参考,具体如下: 本文内容: 什么是视图 创建视图 查看视图 视图的修改 视图的删除 视图的数据操作 首发日期:2018-04-13 什么是视图: 视图是一种...
主要介绍了mysql视图原理与用法,结合实例形式分析了mysql视图的概念、原理、创建、使用方法及相关注意事项,需要的朋友可以参考下
视图就是一张虚拟的表,我们称为视图表,但是这张虚拟的表里边的内容和真实的表内容是一样的,里边有字段,有数据,只不过这张表在服务器上不是以数据的形式存在的,就是视图里的数据在数据库目录下是没有所对应的...
MySQL 5.0 之后的版本添加了对视图的支持。 认识视图 视图是一个虚拟表,其内容由查询定义。同真实表一样,视图包含一系列带有名称的列和行数据,但视图并不是数据库真实存储的数据表。 视图是从一个、多个表或者...