MySQL内置功能

不羁的心 提交于 2019-12-04 05:51:01

1、视图
视图是一个虚拟表(非真实存在),用户只需要使用[名称]即可获取结果集,可以将结果集当作表来使用。
创建视图:create view course_view as select * from course where id > 2;
使用视图:select * from course_view;(本质上是与select * from course where id > 2;相同)
但是无法修改视图中的记录,而且在涉及多个表的情况下是根本无法修改视图中的记录的

修改视图:alter view course_view as 新的sql语句;

删除视图:drop view course_view

2、触发器
触发器能够对表在进行增、删、改操作的前后进行操作。
创建触发器:
在对表进行插入操作之前进行其他操作。
create trigger tri_before_insert_t1 before insert on t1 for each row
begin
    ...
end
在对表进行插入操作之后进行其他操作。
create trigger tri_after_insert_t1 after insert on t1 for each row
begin
    ...
end

触发器无法由用户主动出发,只能在指定的表被增删改之后    被动的触发
删除触发器:drop trigger tri_before_insert_ti;

例子:
# 为例子准备表
CREATE TABLE cmd (
    id INT PRIMARY KEY auto_increment,
    USER CHAR (32),
    priv CHAR (10),
    cmd CHAR (64),
    sub_time datetime, #提交时间
    success enum ('yes', 'no') #0代表执行失败
);
CREATE TABLE errlog (
    id INT PRIMARY KEY auto_increment,
    err_cmd CHAR (64),
    err_time datetime
);

# 创建触发器
delimiter //
create trigger tri_after_insert_cmd after on insert cmd for each row
begin
    IF NEW.success = 'no' THEN
        INSERT INTO errolog(err_cmd, err_time) ON VALUES(NEW.cmd, NEW.sub_time); # 必须加分号
    END IF
END//
delimiter ;

当网cmd插入记录的时候,success字段为no时,会自动往errlog表中插入记录。

3、事务
同时执行多个任务,一旦一个任务执行失败,则会执行回滚(其他任务皆不会执行成功)
例:
# 创表
create table user(
id int primary key auto_increment,
name char(32),
balance int
);

insert into user(name,balance)
values
('xu',1000),
('songy',1000),
('sy',1000);

start transaction;
pdate user set balance=900 where name='xu';
update user set balance=1010 where name='songy';
uppdate user set balance=1090 where name='sy';
commit;
只有输入执行commit之后,才会对表中数据进行了修改
在执行commit之前,用户可以主动执行回滚,命令为:rollback;

4、存储过程
存储过程包含了一系列的可执行的sql语句,存储过程存放在    MySQL中,通过调用存储过程的名字便可以执行内部的一对sql语句
优点:
    1、用于替代程序写的SQL语句,实现程序与sql的节藕
    2、基于网络传输,传别名的数据量小,而直接传sql数据量大

缺点:扩展功能不方便
创建存储过程:
    1、无参数的存储过程创建
        delimiter //
        create procedure p1()
        begin
            select * from user;
            insert into user(name,age,sex) values("xxx",18,'男');
        end //
        delimiter ;
    调用存储过程
        1、在MySQL中调用:call p1();
        2、在Python中调用 cursor.callproc('p1')
                        print(cursor.fetchall())
    2、有参数的存储过程创建
    参数有三类:in 仅用于传入参数用;out 仅用于返回值;inout 既可以作为传入参数,也可以作为返回值
        delimiter //
        create procedure p2(in n1 int, in n2 int, out s)
        begin
            select * from score where id > n1 and id < n2;
            set s = 1;
        end //
        delimiter ;
    调用有参数的存储过程
        1、在MySQL中调用:
            set @s = 0;
            call p2(2,5,@s);
            select @s; # 查询@s的值
        2、在Python中的调用:
            cursor.callproc('p2',(2,5,0))        # 实质上是callproc将参数封装为@_p2_0=2, @_p2_1=5, @_p2_2=0
            print(cursor.fetchall()) # 拿到执行的结果

            cursor.excute('select @_p2_2')
            print(cursor.fetchall()) # 拿到返回的值
    3、删除存储过程
        drop procedure 存储过程名

    ps: 事务、视图、触发器都可以写入存储过程当中

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!