zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    设计模式之模式方法模式
    Extjs 分页多选的实现
    设计模式之策略模式
    oracle 12c 报错 ora-03137 来自客户机的格式错误的TTC包被拒绝
    设计模式之状态模式
    设计模式之装饰者模式
    设计模式之代理模式
    设计模式之单例模式
    从reduce函数说起...
    Django View(视图系统)
  • 原文地址:https://www.cnblogs.com/Jason-lin/p/8654572.html
Copyright © 2011-2022 走看看