merge类型的视图会将查询视图时使用的where条件与定义视图时的where条件相结合,然后从基表中取数据;
temptable类型的是将视图中的数据保存到一个临时表中。
我做了一个测试,就是向基表中插入数据,对于merge类型的视图,查询出新插入的数据很正常,因为本来就是对基表进行查询,可是对于temptable类型的视图,也能查询出新插入的数据!这块没太理解,临时表应该不会有新插入的数据吧?

解决方案 »

  1.   

    mysql> create table test(id int primary key auto_increment,name varchar(10));
    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');
    插入的数据应该没有进入临时表,但事实不是这样,难道临时表会随着基表的改变而改变?