mysql内置功能

1、视图

http://www.cnblogs.com/Jason-lin/p/8653868.html

2、存储过程

简单地说存储过程就是一条或者多条sql语句的集合

存储过程的优点

1、用于替代程序写的SQL语句,实现程序与sql解耦

2、基于网络传输,传别名的数据量小,而直接传sql数据量大

使用存储过程的缺点:

程序员扩展不方便

补充:程序与数据库结合使用的三种方式

#方式一:
    MySQL:存储过程
    程序:调用存储过程

#方式二:
    MySQL:
    程序:纯SQL语句

#方式三:
    MySQL:
    程序:类和对象,即ORM(本质还是纯SQL语句)

将mysql的结束符设置为//

delimiter //

一、创建简单的无参存储过程

create procedure s1()
BEGIN
    select * from student;
    insert into student(sid,sname) values(20, 'test');
END //

在sql中调用

call s1 //

在pymysql中调用

cursor.callproc('s1')
print(cursor.fetchall())

二、创建有参的存储过程

对于存储过程,可以接收参数,其参数有三类:

#in          仅用于传入参数用
#out        仅用于返回值用
#inout     既可以传入又可以当作返回值

仅用于传入参数用 IN

create procedure s2(
 in n1 int,
 in n2 int
)
BEGIN
    select * from student where sid>n1;
END //

OUT

create procedure s3(
 in n1 int,
 out res int
)
BEGIN
    select * from student where sid>n1;
    set res=1;
END //

在mysql中调用

set @res=0//
call s3(3,@res)//
select @res//

在pymysql中调用

cursor.callproc('s3',(3,0) )  #0相当于set @res=0
print(cursor.fetchall()) #查询select的查询结果
cursor.callproc('s3', (3, 0))
cursor.execute('select @_s3_1;')
print(cursor.fetchone())

删除存储过程

drop procedure s1//

 

3、触发器

触发器是一个特殊的存储过程,不同的是存储过程要使用call语句调用,而触发器是通过设定预定义事件,当这个预定义事件发生时,就会被mysql调用

创建触发器

# 插入前
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 插入后
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 删除前
CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 删除后
CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 更新前
CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
BEGIN
    ...
END

# 更新后
CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
BEGIN
    ...
END

准备表

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

创建触发器

create trigger tri_after_insert_cmd after insert on cmd for each row
begin
    if new.success = 'no' THEN
        insert into errlog(err_cmd, err_time) values(new.cmd,new.sub_time);
    end if;
end//

插入数据

INSERT INTO cmd (
    USER,
    priv,
    cmd,
    sub_time,
    success
)
VALUES
    ('egon','0755','ls -l /etc',NOW(),'yes'),
    ('egon','0755','cat /etc/passwd',NOW(),'no'),
    ('egon','0755','useradd xxx',NOW(),'no'),
    ('egon','0755','ps aux',NOW(),'yes')
//

查询

select * from errlog //

注意:NEW表示即将插入的数据行,OLD表示即将删除的数据行。

删除触发器

drop trigger tri_after_insert_cmd;

4、事务

http://www.cnblogs.com/Jason-lin/p/8654590.html

 

posted @ 2018-03-26 22:35  Jason_lincoln  阅读(193)  评论(0编辑  收藏  举报