7章 视图与触发器,8章存储过程,游标

create view 视图名[(视图字段列表)]
as
select 语句
[with [local | cascaded] check option]
建视图名中统一添加前缀view_或后缀_view
视图的作用
1:是操作变得简单
2:避免冗余数据
3:增强安全性
同一个数据可以创建不同的视图,为不同的用户分配不同的视图,这样可以实现不同的用户只能查询和修改对应的数据,从而增强数据的安全性。
4:提高数据的逻辑独立性
有了视图,应用程序可以建立在视图之上,从而使应用程序和数据表结构在一定程度上逻辑分离。
a: 视图可以向应用程序屏蔽表结构,如果表结构发生变化,只需修改视图,无需修改应用程序
b:使用视图可以向数据库屏蔽应用程序。如果应用程序发现变化,只需重新定义或修改视图,无需修改数据库表结构。

drop view视图名

create trigger 触发器名 触发时间 触发事件 on 表名 for each row
begin
触发程序
end;

查看触发器定义
show triggers;
删除触发器 drop trigger 触发器名;
触发器注意事项:
1:如果触发程序包含select语句,select不能返回结果集
2:同一个表不能创建两个相同的触发器
3:触发程序中不能显示或隐式的打开,开始或结束事务。
4:触发器针对记录操作,当批量操作时,性能降低。
5:MyISAM引擎中,触发器不能保证原子性。
8:MySQL触发程序不能对本表执行update操作,可以用set命令代替,否则会出错。
9:before触发程序中,auto_increment字段的new值为0,不是实际插入记录时自动生成的自增类型字段。

临时表分为内存临时表(in-memory)以及外存临时表(on-disk)
手工创建临时表,就是正常create table语句加上temporary
如:
create temporary table temp(name char(100));
insert into temp values('test');
select * from temp;
查看临时表 show create table临时表名;
删除 drop temporary table临时表名;
注意事项:
临时表是数据库对象,因此创建临时表需要指定该临时表属于哪个数据库。
临时表如果与基表重名,那么基表将被隐藏,除非临时表删除,基表才能被访问。
MyISAM,Merge ,InnoDB引擎都支持临时表
临时表引擎由default_tmp_storage_engine决定
show table 命令不会显示临时表
rename不能重命名临时表,但可以使用alter table 来重命名
通过视图虽然可以更新基表数据,但不建议这么做,因为通过视图更新基表数据,并不会触发触发器运行。

存储过程
create procedure 存储过程名(参数1,参数2,……)
[存储过程选项]
begin
存储过程语句块;
end;

存储过程参数有in , out , inout
存储过程必须通过call来调用
查看存储过程 show procedure status;
show procedure status like模式 过滤查找
select name from mysql.proc where db='choose' and type ='procedure';
通过命令 show create procedure存储过程名; 可以查看指定数据库指定存储过程的详细信息,存储过程信息保存在information_schema数据库中routines表
Select * from information_schema.routines where routine_name = '存储过程名';
drop procedure存储过程名; 来删除存储过程
存储过程与函数的区别:
1:函数有且仅有一个返回值,且必须指定返回值类型。存储过程可以没有返回值,也可以有,甚至多个,返回值需要使用out或者inout参数定义。
2:函数可以使用select……into语句为变量赋值,但不能使用select返回结果集。存储过程则都可以。
3:函数可以直接嵌入到sql语句或表达式中,可以扩展标准的sql语句,存储过程则需要单独调用,并使用call关键字。
4:函数中的函数体限制比较多,比如不能显示或隐式的打开,开始或结束事务。存储过程则限制较少,可以使用事务,可以使用预处理SQL语句。
5:应用程序调用函数时,通常将函数封装成sql字符串进行调用,而调用存储过程必须使用call关键字。存储过程返回值通过out或inout参数传递给mysql会话变量。

自定义错误处理程序:
declare 错误处理类型 handler for 错误触发条件 自定义错误处理程序;
自定义错误触发条件
declare 错误触发条件 condition for MySQL错误代码或者ANSI标准错误代码
如:
declare continue handler for 1452
begin
set @error1='外键约束错误!';
end;
可以修改为:
declare foreign_key_error condition for sqlstate '23000';
declare continue handler for foreign_key_error
begin
set @error1='外键约束错误!';
end;
说明:
MySQL预定义了sqlexception,sqlwarning,not found等错误触发条件,这些错误触发条件无需数据库开发人员定义,可以直接使用。

declare游标 --声明游标
opne游标-- 打开游标
fetch游标 --提取数据
处理结果集中的数据
close游标--关闭游标

declare游标名 cursor for select语句
声明游标后,游标中select语句并没有执行,没有select语句集。
open 游标名
打开游标名,select语句被执行,MySQL服务器内存有select语句结果集。
从游标中取数据
fetch 游标名 into 变量名1,变量名2,……
说明:变量名个数必须与声明游标时使用的select语句结果集中字段个数保存一致。
fetch语句需要循环语句配合,才能实现整个结果集的遍历。
当fetch语句取出最后一个记录,再次执行fetch语句将产生“ERROR 1329(02000):No data to FETCH”错误信息,数据库开发时可以针对1329自定义错误处理程序,以便结束结果集遍历。
关闭游标:
close 游标名

预处理SQL
1:创建预处理SQL
prepare 预处理SQL语句名 from SQL字符串
如:
prepare select_class_pre from 'select * from classes';
预处理语句是数据库对象,因此创建预处理语句SQL时,需要指定属于哪个数据库。
执行预处理语句:
execute预处名[using 填充数据[,填充数据……]]
using 将填充数据到SQL语句中对应位置的“?”问号。
如: execute select_class_pre;
释放预处理语句
deallocate prepare预处理名;

MySQL的存储程序分为4类:函数,触发器,存储过程以及事件。

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

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,130评论 0 9
  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,764评论 5 116
  • 1.1 基本结构 PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。 1.2 命名规则 1.3 记...
    慢清尘阅读 3,816评论 3 14
  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 9,695评论 0 44
  • 原英文文档 简介 matplotlib是一个在python中广泛使用的2-D绘图包。其为python数据的可...
    charmler阅读 1,299评论 0 1