1,mysql的视图名不能和现有表名重复
mysql> show tables; //查看表
+------------------+
| Tables_in_uchome |
+------------------+
| comment |
| user |
+------------------+
2 rows in set (0.00 sec)
mysql> create view useras select * from user; //视图名和存在表重名,报错
ERROR 1050 (42S01): Table'user' already exists
mysql> create view v_useras select * from user; //创建视图
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;//查看表,包涵了视图
+------------------+
| Tables_in_uchome |
+------------------+
| comment |
| user |
| v_user |
+------------------+
3 rows in set (0.00 sec)
mysql> check table v_user;//查看一下视图,
+---------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------------+-------+----------+----------+
| test_1.v_user | check | status | OK |
+---------------+-------+----------+----------+
1 row in set (0.00 sec)
从上面的一些操作,我们可以看出,其实mysql有的时候,已经把视图当成一种虚拟表来使用了,既然是一种虚拟表,表名当然是不能重复的了。
2,视图所对应的表,不能是临时表
//创建临时表 tmp_user
mysql> CREATE temporary TABLE IF NOT EXISTS `tmp_user` (
-> `id` int(11) NOT NULL AUTO_INCREMENT COMMENT'用户ID',
-> `name` varchar(50) NOT NULL DEFAULT'' COMMENT '名称',
-> `sex` int(1) NOT NULL DEFAULT'0' COMMENT '0为男,1为女',
-> PRIMARY KEY (`id`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Query OK, 0 rows affected (0.04 sec)
mysql> desc tmp_user;//查看临时表,用show tables;看不到的。用check table也可以看到
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | | |
| sex | int(1) | NO | | 0 | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> create view v_testas 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_testas select * from aa where id=@test; //创建视图
ERROR 1351 (HY000): View's SELECT contains a variableor 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_testas execute p_test; //使用预处理变量报错
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versionfor the right syntax to use near 'execute p_test' at line 1
mysql> create view v_testas p_test; //这样也不行
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versionfor 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_testas 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_testas "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 //添加索引会报错的
视图根本不是基本的表,在存放数据的文件夹中,他只有一个结构文件,没有.MYD,.MYI文件,如果能增加索引存放到什么地方。
8,视图插入,添加,删除的限制
对于有些视图是可以UPDATE、DELETE或INSERT等操作的,以达到修改基本表的内容。对于可更新的视图,它必须和基本表是一一对应关系。如果视图中包括以下的东西就不是一一对应关系了。就不能进行更新操作。
//下面的视图根基本表user是一一对应关系,可以进行更新操作
mysql> create view v_useras select * from user;
Query OK, 0 rows affected (0.00 sec)
//视图对应二个基本表,视图中的内容,不和任何一张表一一对应,不能进行更新操作
mysql> create view tallas select a.id,a.name,b.content from user a left join comment b on a.id=b.u_id where b.content != 'null';
Query OK, 0 rows affected (0.00 sec)
a),聚合函数(SUM(), MIN(), MAX(), COUNT()等)。
b),DISTINCT
c),GROUP BY
d),HAVING
e),UNION或UNION ALL
f),位于选择列表中的子查询
g),Join
h),FROM子句中的不可更新视图
i),WHEHE子句中的子查询,引用FROM子句中的表。
m),仅引用文字值(在该情况下,没有要更新的基本表)。
n),ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。
o),关于可插入性(可用INSERT语句更新),如果它也满足关于视图列的下述额外要求,可更新的视图也是可插入的:
p),不得有重复的视图列名称。
q),视图必须包含没有默认值的基表中的所有列。
r),视图列必须是简单的列引用而不是导出列。
上面a-r的这几种情况,其实就是一种情况,规则就是,视图的数据根基本表的数据不一样了。
转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/mysql/1065.html
Mysql 增加,删除外键。
在这里先讲一下删除主键的命令;
alter table your_table_name drop primary key;//这个是删除主键的指令(这里的主键不能是别的表的外键,否则删除这个主键的时候,你得先把他的外键删掉);
增加主键:alter table your_table_name add primary key (your_primary_key_name);//最后边的那个()一点要有;
增加外键:alter table your_table_name add foreign key your_foreign_key_id(your_foerign_key_name) references zhu_jian_table_name(your_foreign_key_name);//
这里的那个foreign_key_id 是你自己给你的foreign_key 起的一个标示,
然后你的foreign_key_name就是你自己起得foreign_key的名字(表中列名)了,
这两个(可以理解为一个是id,一个是别名)
如果这里你增加外键的时候遇到:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint f
ails (仓库管理.#sql-f60_4, CONSTRAINT #sql-f60_4_ibfk_1 FOREIGN KEY (仓库
号
) REFERENCES 仓库 (仓库号))
这个error你可以先set foreign_key_checks = 0;再去添加外键。
如果你的外键创建的时候在show create table table_name;出现
KEY 职工号 (职工号),而在后边没有 CONSTRAINT 订购单_ibfk_1 FOREIGN KEY (职工号) REFERENCES 职工 (职工号)这个的时候,这说明你的外键应该没有创建成功,所以你需要先把Key这个索引drop掉;drop index index_name on table_name ;(这个是drop索引的指令)
然后再去添加外键就好了。
删除外键:alter table your_table_name drop foreign key your_foreign_key_id;
这个foreign_key_id 在上边增加外键的时候已经说了,如果你不知你的foreign_key_id也没事,可以用show create table your_table_name找出来;
修改某一行的内容的指令:
update tablename set you_want_to_update_name = update_name where
zhujian_name = zhujianname;
删除一个表:
drop table your_table_name;
删除一个数据库:
drop database your_database_name;
查看一个数据表的有哪些列以及他们的约束条件:
describe your_table_name;
查看你的数据库有什么:
show databases;
查看你的某个数据库有哪些表:
use your_database_name;
show table_name;
查看你的表所有内容:
select * form your_table_name;
查看你表的某一行的内容:
select * from your_table_name where your_primary_key = you_want_to_serach;
删除某一行:
delete from table_name where zhujian_name=you_want_delete_name;
更改表的某一个内容的属性:
alter table your_table_name modify you_want_to_modify_name 数据类型 null(not null);
好了这就是我今天的收获.