我是靠谱客的博主 坚定香菇,最近开发中收集的这篇文章主要介绍SQL触发器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

介绍

介绍

触发器分类

insert型触发器

创建触发器

实例操作

update型触发器

实例操作

delete型触发器

实例操作

查看和删除触发器

实例操作


  • 介绍

  • 介绍

  • 触发器是与表有关的数据库对象
  • 可以在insert,update,delete之前或之后触发并执行触发器中定义的SQL语句
  • 这种特性可以协助应用系统在数据库端确保数据的完整性,日志记录,数据校验等操作
  • 通过使用别名NEW和OLD来引用触发器中发生变化的内容记录
  • 触发器分类

  • insert型触发器
    • OLD:无(因为插入前无数据)
    • NEW:NEW表示将要或者已经新增的数据
  • update型触发器
    • OLD:OLD表示修改之前的数据
    • NEW:NEW表示将要或者已经修改后的数据
  • delete型触发器
    • OLD:OLD表示将要或者已经删除的数据
    • NEW:无(因为删除后状态无数据)
  • insert型触发器

  • 创建触发器

  • delimiter $
  • create trigger 触发器名称
  • before|after insert|update|delete
  • on 表名
  • for each row
  • begin
    • 触发器要执行的功能;
  • end$
  • delimiter ;
  • 实例操作

  • CREATE TABLE account(
    id INT PRIMARY KEY auto_increment, -- 账户id
    name varchar(20), -- 姓名
    money DOUBLE -- 余额
    );
    -- 添加数据
    INSERT INTO account VALUES (NULL,'张三',1000),(NULL,'李四',1000);
    -- 创建日志表account_log
    CREATE TABLE account_log (
    id INT PRIMARY KEY auto_increment, -- 日志id
    operation VARCHAR(20), -- 操作类型(insert,update,delete)
    operation_time datetime, -- 操作时间
    operation_id INT, -- 操作表的id
    operation_params VARCHAR(200) -- 操作参数
    );
    -- 创建insert型触发器,用于对account表新增数据进行日志的记录
    delimiter $
    CREATE TRIGGER account_insert
    AFTER INSERT
    ON account
    FOR EACH ROW
    BEGIN
    INSERT INTO account_log VALUES (NULL,'INSERT',NOW(),new.id,CONCAT('插入后{id=',new.id,'money=',new.money,'}'));
    END$
    delimiter ;
    -- 向account表添加一条记录
    INSERT INTO account VALUES (NULL,'王五',2000);
    -- 查询account表
    SELECT * FROM account;
  • CREATE TABLE account(
    id INT PRIMARY KEY auto_increment, -- 账户id
    name varchar(20), -- 姓名
    money DOUBLE -- 余额
    );
    -- 添加数据
    INSERT INTO account VALUES (NULL,'张三',1000),(NULL,'李四',1000);
    -- 创建日志表account_log
    CREATE TABLE account_log (
    id INT PRIMARY KEY auto_increment, -- 日志id
    operation VARCHAR(20), -- 操作类型(insert,update,delete)
    operation_time datetime, -- 操作时间
    operation_id INT, -- 操作表的id
    operation_params VARCHAR(200) -- 操作参数
    );
    -- 创建insert型触发器,用于对account表新增数据进行日志的记录
    delimiter $
    CREATE TRIGGER account_insert
    AFTER INSERT
    ON account
    FOR EACH ROW
    BEGIN
    INSERT INTO account_log VALUES (NULL,'INSERT',NOW(),new.id,CONCAT('插入后{id=',new.id,',name=',new.name,',money=',new.money,'}'));
    END$
    delimiter ;
    -- 向account表添加一条记录
    INSERT INTO account VALUES (NULL,'王五',2000);
    -- 查询account_log表
    SELECT * FROM account_log;
  • update型触发器

  • 创建触发器方式与insert一样
  • 实例操作

  • CREATE TABLE account(
    id INT PRIMARY KEY auto_increment, -- 账户id
    name varchar(20), -- 姓名
    money DOUBLE -- 余额
    );
    -- 添加数据
    INSERT INTO account VALUES (NULL,'张三',1000),(NULL,'李四',1000);
    -- 创建日志表account_log
    CREATE TABLE account_log (
    id INT PRIMARY KEY auto_increment, -- 日志id
    operation VARCHAR(20), -- 操作类型(insert,update,delete)
    operation_time datetime, -- 操作时间
    operation_id INT, -- 操作表的id
    operation_params VARCHAR(200) -- 操作参数
    );
    -- 创建update型触发器,用于对account表修改数据进行日志的记录
    delimiter $
    CREATE TRIGGER account_update
    AFTER UPDATE
    ON account
    FOR EACH ROW
    BEGIN
    INSERT INTO account_log VALUES (NULL,'UPDATE',NOW(),new.id,CONCAT('更新前{id=',old.id,',name=',old.name,',money=',old.money,'}','更新后{id=',new.id,',name=',new.name,',money=',new.money,'}'));
    END$
    delimiter ;
    -- 修改account表中李四的金额为2000
    UPDATE account SET money=2000 WHERE id=2;
    -- 查询account表
    SELECT * FROM account;
  • CREATE TABLE account(
    id INT PRIMARY KEY auto_increment, -- 账户id
    name varchar(20), -- 姓名
    money DOUBLE -- 余额
    );
    -- 添加数据
    INSERT INTO account VALUES (NULL,'张三',1000),(NULL,'李四',1000);
    -- 创建日志表account_log
    CREATE TABLE account_log (
    id INT PRIMARY KEY auto_increment, -- 日志id
    operation VARCHAR(20), -- 操作类型(insert,update,delete)
    operation_time datetime, -- 操作时间
    operation_id INT, -- 操作表的id
    operation_params VARCHAR(200) -- 操作参数
    );
    -- 创建update型触发器,用于对account表修改数据进行日志的记录
    delimiter $
    CREATE TRIGGER account_update
    AFTER UPDATE
    ON account
    FOR EACH ROW
    BEGIN
    INSERT INTO account_log VALUES (NULL,'UPDATE',NOW(),new.id,CONCAT('更新前{id=',old.id,',name=',old.name,',money=',old.money,'}','更新后{id=',new.id,',name=',new.name,',money=',new.money,'}'));
    END$
    delimiter ;
    -- 修改account表中李四的金额为2000
    UPDATE account SET money=2000 WHERE id=2;
    -- 查询account_log表
    SELECT * FROM account_log;
  • delete型触发器

  • 实例操作

  • CREATE TABLE account(
    id INT PRIMARY KEY auto_increment, -- 账户id
    name varchar(20), -- 姓名
    money DOUBLE -- 余额
    );
    -- 添加数据
    INSERT INTO account VALUES (NULL,'张三',1000),(NULL,'李四',1000);
    -- 创建日志表account_log
    CREATE TABLE account_log (
    id INT PRIMARY KEY auto_increment, -- 日志id
    operation VARCHAR(20), -- 操作类型(insert,update,delete)
    operation_time datetime, -- 操作时间
    operation_id INT, -- 操作表的id
    operation_params VARCHAR(200) -- 操作参数
    );
    -- 创建delete型触发器,用于对account表删除数据进行日志的记录
    delimiter $
    CREATE TRIGGER account_delete
    AFTER DELETE
    ON account
    FOR EACH ROW
    BEGIN
    INSERT INTO account_log VALUES (NULL,'DELETE',NOW(),old.id,CONCAT('删除前{id=',old.id,',name=',old.name,',money=',old.money,'}'));
    END$
    delimiter ;
    -- 删除account表中李四
    DELETE FROM account WHERE id=2;
    -- 查询account表
    SELECT * FROM account;
  • CREATE TABLE account(
    id INT PRIMARY KEY auto_increment, -- 账户id
    name varchar(20), -- 姓名
    money DOUBLE -- 余额
    );
    -- 添加数据
    INSERT INTO account VALUES (NULL,'张三',1000),(NULL,'李四',1000);
    -- 创建日志表account_log
    CREATE TABLE account_log (
    id INT PRIMARY KEY auto_increment, -- 日志id
    operation VARCHAR(20), -- 操作类型(insert,update,delete)
    operation_time datetime, -- 操作时间
    operation_id INT, -- 操作表的id
    operation_params VARCHAR(200) -- 操作参数
    );
    -- 创建delete型触发器,用于对account表删除数据进行日志的记录
    delimiter $
    CREATE TRIGGER account_delete
    AFTER DELETE
    ON account
    FOR EACH ROW
    BEGIN
    INSERT INTO account_log VALUES (NULL,'DELETE',NOW(),old.id,CONCAT('删除前{id=',old.id,',name=',old.name,',money=',old.money,'}'));
    END$
    delimiter ;
    -- 删除account表中李四
    DELETE FROM account WHERE id=2;
    -- 查询account_log表
    SELECT * FROM account_log;
  • 查看和删除触发器

  • 查看触发器
  • show triggers;
  • 删除触发器
  • drop trigger 触发器名称;
  • 实例操作

  • -- 查看触发器
    SHOW TRIGGERS;

最后

以上就是坚定香菇为你收集整理的SQL触发器的全部内容,希望文章能够帮你解决SQL触发器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部