最近写一个翻译关系代数的小程序,遇到了一个视图的问题。数据库显示不存在该视图,在网上查找了很多答案,有的说是因为用户权限问题,但是我的用户权限是所有都可以操作。总之网上的答案都要需要自己去揣摩,都不能解决我的问题。主要原因是被数据库的报错给混淆了思路,往错误的方向去查找解决。首先我使用的数据库是mysql,一个开源,简单且免费的数据库,虽然不像Oracle数据库功能庞大但是对于目前很多网页系统也足够使用了。这里就先上代码给大家看再讲解:
CREATE OR REPLACE VIEW table1 AS SELECT * FROM sc
这句话的意思就是生成一个视图table1,视图的定义是查询表sc生成的。
CREATE OR REPLACE VIEW table2 AS SELECT * FROM s
这句话的意思同样,生成一个视图table2,视图的定义是查询表s生成的。
这样在数据库中就存在了两个视图
好了,现在我们创建第三个视图table3,并定义它的视图规则是由视图table1和视图table2自然连接而来的,自然连接的sql语法是 sql语句:Select …… from 表1 natural join 表2;如下表
CREATE OR REPLACE VIEW table3 AS SELECT * FROM table1 NATURAL JOIN table2
现在我们把table3赋予给table1看看会出现什么情况:
CREATE OR REPLACE VIEW table1 AS SELECT * FROM table3
这时候数据库会报错[Err] 1146 - Table 'sql.table1' doesn't exist!,在 数据库中将一个由其他视图生成的新视图赋予给旧的视图是不允许的,table3是由table1和table2而来的,存在主从关系,不能赋予给table1,即使将视图table1删除也不能解决。这就要设计到视图的概念,视图在数据库中存在的性质是一串代码,每次访问视图只是数据库识别代码去找寻真正表的数据并显示出来。这个时候的新视图table3对于table1就是不可更新的。
说到这里我也向读者展示其他视图不可更新的情况:
以下部分的内容是转载于其他博客
1、mysql中那些视图使不可更新的?以下类型的视图是不可更新的
1.包含以下关键字的sql语句:聚合函数(sum、min、max、count)、distinct、group by 、having、union或者uinon all
2.常量视图
3.select 中包含子查询
4.join
5.from一个不可更新的视图
6.where字句的子查询引用了from字句中的表
2、更新视图的限制
WITH[CASCADED | LOCAL] CHECK OPTION确定了更新视图的条件。
LOCAL代表只要满足本视图的条件就可以更新
CASCADED 则必须满足所有针对该视图的所有视图条件才可以更新
如果没有明确是local还是cascade,默认是cascade