zoukankan      html  css  js  c++  java
  • SQL基础-存储过程&触发器

    一、存储过程

    1、存储过程简介

    存储过程:
        一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,然后通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
    
    存储过程的创建:
        使用关键字CREATE PROCEDURE


    2、存储过程的创建及调用

    比如:
        现需要向学生表中插入新的学生数据。但在插入学生数据的时,需要同时检查老师表里的数据。
        如果插入学生的老师不在老师表里,则先向老师表中插入一条老师数据,再向学生表中插入学生数据。
    
    步骤:
        1、使用SELECT语句查询新学生的老师是否存在于老师表中;
            如果不存在 ,则继续执行第2步;
            如果存在,则直接跳到第3步;
        2、向老师表中插入老师数据;
        3、向学生表中插入学生数据;
    
    
    ##
    存储过程的创建:
    
    CREATE PROCEDURE sp_add_student(
      IN i_student_id VARCHAR(50), IN i_student_name VARCHAR(100),
      IN i_gender VARCHAR(10), IN i_birth_day DATE,
      IN i_age INT, IN i_class_id VARCHAR(50),
      IN i_score DECIMAL(18,2), IN i_teacher_id VARCHAR(20)
    )
    BEGIN
      IF NOT EXISTS(SELECT 1 FROM teacher WHERE teacher_id = i_teacher_id) THEN
        INSERT INTO teacher(teacher_id) VALUES (i_teacher_id);
      END IF;
      INSERT INTO student VALUES(
        i_student_id,i_student_name,i_gender,i_birth_day,
        i_age, i_class_id, i_score, i_teacher_id
    );
    END;
    
    
    ##
    存储过程的调用:使用关键字CALL
    
    CALL sp_add_student( 
        'S20170091', '杨艳', '', '2003-04-09',
        15, 'G0206', 89.23, 'T0021' 
    );


    3、存储过程的删除

    存储过程的删除:
        使用关键字DROP PROCEDURE
    
    如:DROP PROCEDURE sp_add_student;


    4、存储过程的优缺点

    优点:
     功能强大、灵活性高;
     模块化,封装,代码复用;
    
    缺点:
     开发调试困难;
     可移植性差,不同数据库,语法差别很大,移植困难;


    二、触发器

    1、触发器简介

    触发器:
        一种与表操作有关的数据库对象,当触发器所在表上出现指定事件(新增、修改、删除数据)时,将调用该对象,即表的操作事件触发表上的触发器的执行。
    
    
    
    如上面的存储过程中:
    写出了存储过程,并调用:
        
    CALL sp_add_student( 
    'S20170091', '杨艳', '', '2003-04-09',
    15, 'G0206', 89.23, 'T0021’
    );
    
    如果有多个学生的数据需要插入,则需要多次调用该存储过程;
    
     可否不开发存储过程,在向student表插入(INSERT)数据前,后台自动判断并插入老师数据?
    
    ---触发器


    2、触发器的创建及调用

    触发器的创建:使用关键字CREATE TRIGGER
    
    比如:
        现需要向学生表中插入新的学生数据。但在插入学生数据的时,需要同时检查老师表里的数据。如果插入学生的老师不在老师表里,
        则先向老师表中插入一条老师数据,再向学生表中插入学生数据。
    
    创建一个BEFORE INSERT触发器:
    CREATE TRIGGER tri_add_student BEFORE INSERT
    ON student FOR EACH ROW
    BEGIN
        IF NOT EXISTS(SELECT 1 FROM teacher WHERE teacher_id = 
    new.teacher_id) THEN
            INSERT INTO teacher(teacher_id) VALUES (new.teacher_id);
        END IF;
    END;
    
    执行insert语句:
    INSERT INTO student VALUES(
    'S20170092', '李文', '', '2002-11-19',
    16, 'G0206', 55.32, 'T0022'
    );
    
    
    BEFORE INSERT触发器:
        在执行insert语句之前,会先自动执行触发器;


    3、触发器的分类及执行顺序

    按事件类型分:
     INSERT触发器;
     UPDATE触发器;
     DELETE触发器;
    
    按执行先后分:
     BEFORE触发器;
     AFTER触发器;
    
    
    NEW与OLD:
        INSERT触发器:NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
    
         UPDATE触发器:OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
    
         DELETE触发器:OLD 用来表示将要或已经被删除的原数据;
    
    
    触发器执行时的异常情况:
        如果 BEFORE 触发器执行失败,SQL 无法正确执行;
    
         SQL 执行失败时,AFTER 型触发器不会触发;
    
         AFTER 类型的触发器执行失败,SQL 会回滚;


    4、触发器的删除

    触发器的删除:
        使用关键字DROP TRIGGER
    
    如:DROP TRIGGER tri_add_student;


    5、触发器的优缺点

    优点:
     自动触发,无需调用;
     提供了一种检查、保证数据完整性的方法;
     与存储过程一样,增强SQL语言的功能和灵活性;
    
    缺点:
     开发调试困难;
     可移植性差;
  • 相关阅读:
    STM32 printf 方法重定向到串口UART
    STM32F401CCU6与MFRC522接线及读取示例
    Keil MDK5 STM32F401CCU6开发环境配置
    Keil MDK5 STM32F103C8T6开发环境配置
    RFID EPC Class1 Gen2电子标签笔记
    Ubuntu20.04下的ESP8266环境
    Centos7使用memtester测试内存
    内核5.4以上, Realtek 8111网卡初始化失败
    Centos7的KVM安装配置详解
    Python抓取网页例子
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/11446734.html
Copyright © 2011-2022 走看看