美文网首页
7章 视图与触发器,8章存储过程,游标

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

作者: 凯睿看世界 | 来源:发表于2019-02-25 11:22 被阅读0次

    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类:函数,触发器,存储过程以及事件。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/qdmwyqtx.html