merge类型的视图会将查询视图时使用的where条件与定义视图时的where条件相结合,然后从基表中取数据;
temptable类型的是将视图中的数据保存到一个临时表中。
我做了一个测试,就是向基表中插入数据,对于merge类型的视图,查询出新插入的数据很正常,因为本来就是对基表进行查询,可是对于temptable类型的视图,也能查询出新插入的数据!这块没太理解,临时表应该不会有新插入的数据吧?
temptable类型的是将视图中的数据保存到一个临时表中。
我做了一个测试,就是向基表中插入数据,对于merge类型的视图,查询出新插入的数据很正常,因为本来就是对基表进行查询,可是对于temptable类型的视图,也能查询出新插入的数据!这块没太理解,临时表应该不会有新插入的数据吧?
mysql> insert into test(name) values('a'),('b'),('c'),('d');
mysql> create algorithm=merge view v1 as select * from test where name = 'a';
mysql> create algorithm=temptable view v2 as select * from test where name = 'a';
mysql> select*from v1;
+----+------+
| id | name |
+----+------+
| 1 | a |
+----+------+
mysql> select*from v2;
+----+------+
| id | name |
+----+------+
| 1 | a |
+----+------+
mysql> insert into test(name) values('a');mysql> select* from v1;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 5 | a |
+----+------+mysql> select* from v2;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 5 | a |
+----+------+
问题就在select* from v2;
我的理解是创建视图v2时,就创建了临时表,所以insert into test(name) values('a');
插入的数据应该没有进入临时表,但事实不是这样,难道临时表会随着基表的改变而改变?