• 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

  • 相关阅读:
    火狐(firefox)浏览器插件开发简明教程
    linux查看硬件信息
    【MySQL】MySQL批量KILL线程
    【MySQL】MySQL8动态调整redo日志的大小
    【SQLServer】使用sp_whoisactive记录sqlserver数据库活动
    【PostgreSQL】连接到PostgreSQL Server
    【MySQL】MySQL 5.6多线程复制和GTIDs的补充
    Performance Schema: Measure MultiThreaded Slave Activity
    【MySQL】MySQL估算redo日志的容量
    【SQLSERVER】查询Job作业基本信息及执行情况
  • 原文地址:https://www.cnblogs.com/Jason-lin/p/8654572.html
Copyright © 2020-2023  润新知