mysql> create view v_test as select * from tmp_user; //用临时表会报错,看下的错
ERROR 1352 (HY000): View's SELECT refers to a temporary table 'tmp_user'
复制代码
3,创建视图时不能使用系统或用户变量
mysql> set @test="2"; //定义一个用户变量
Query OK, 0 rows affected (0.00 sec)
mysql> create view vv_test as select * from aa where id=@test; //创建视图
ERROR 1351 (HY000): View's SELECT contains a variable or parameter //报sql中有变量,错误
mysql> select * from aa where id=@test; //真正的表是可以使用的
+----+------+------------+------+
| id | name | nname | sex |
+----+------+------------+------+
| 2 | d | bbbb,4bbbb | NULL |
+----+------+------------+------+
1 row in set (0.00 sec)
复制代码
4,不能使用预处理语句参数,存储过程中的参数或局部变量
mysql> prepare p_test from "select * from user"; //产生一个预处理变量
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> create view v_test as execute p_test; //使用预处理变量报错
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'execute p_test' at line 1
mysql> create view v_test as p_test; //这样也不行
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'p_test' at line 1
mysql> execute p_test; //单独是没问题的
+----+--------+-----+
| id | name | sex |
+----+--------+-----+
| 1 | zhangy | 0 |
| 3 | tank | 0 |
| 4 | tank | 0 |
+----+--------+-----+
3 rows in set (0.00 sec)
复制代码
存储过程中产生的参数,或者是局量也不行,大家可以试一下。
5,如果预处理语句调用了视图,视图就不能变了。
mysql> create view aa_test as select * from comment; //创建一个视图
Query OK, 0 rows affected (0.26 sec)
mysql> prepare test22 from "select * from aa_test"; //预处理语句使用了这个视图
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> execute test22; //调用一下预处理语句
+------+------+--------+---------+
| c_id | u_id | name | content |
+------+------+--------+---------+
| 1 | 1 | zhangy | test |
| 2 | 1 | zhangy | test2 |
+------+------+--------+---------+
2 rows in set (0.00 sec)
mysql> alter view aa_test as select * from user; //修改视图,把基础表改成user
Query OK, 0 rows affected (0.00 sec)
mysql> execute test22; //在调用一下预处理语句,内容没有变
+------+------+--------+---------+
| c_id | u_id | name | content |
+------+------+--------+---------+
| 1 | 1 | zhangy | test |
| 2 | 1 | zhangy | test2 |
+------+------+--------+---------+
2 rows in set (0.00 sec)
复制代码
6,在存储过程中不能修改视图
mysql> create procedure test3()
-> begin
-> select * from aa_test;
-> alter view aa_test as "select * from comment";
-> select * from aa_test;
-> end;|
ERROR 1314 (0A000): ALTER VIEW is not allowed in stored procedures //会报错的
复制代码
为什么是mysql手册里面,我看到可以在存储过程中修改视图的,为什么我用的mysql就不行呢?是不是mysql版本的问题。我用的是Server version: 5.1.26-rc-log Source distribution
7,不能给视图添加索引
mysql> create index aa_index on aa_test (c_id);
ERROR 1347 (HY000): 'test.aa_test' is not BASE TABLE //添加索引会报错的