MySQL视图问题以及主外键

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); 

好了这就是我今天的收获.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 1,MySQL权限体系 mysql 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一个给定服务器中的所有...
    不排版阅读 932评论 0 4
  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 4,028评论 0 19
  • MySQL 数据库常用命令 1、MySQL常用命令 create database name; 创建数据库 use...
    55lover阅读 4,770评论 1 57
  • 【题记:情感总是在生活夹缝间充盈然后溢出,你我本是陌生人,却因一抬头、一微笑、一擦肩、一话语,将两个人的人生汇聚在...
    枫枫lam阅读 312评论 0 0
  • 八月最后几天,我随着李老师一起去参加了在北京国家会议中心举行的2017年中国药物化学学术会议。大会会程两天半,其中...
    Raiy_J阅读 421评论 0 0