当前位置: 代码网 > it编程>数据库>Mysql > Mysql触发器写法及示例详解

Mysql触发器写法及示例详解

2026年08月28日 Mysql 我要评论
mysql 触发器(trigger)是一种特殊类型的存储过程,它在满足一定条件时自动执行。触发器可以定义在表上的insert、update或delete操作之前或之后执行。这对于数据的完整性检查、自动

mysql 触发器(trigger)是一种特殊类型的存储过程,它在满足一定条件时自动执行。触发器可以定义在表上的insert、update或delete操作之前或之后执行。这对于数据的完整性检查、自动更新相关数据等场景非常有用。

创建触发器的语法

create trigger trigger_name
{before | after} {insert | update | delete}
on table_name for each row
begin
    -- 触发器执行的sql语句
end;

示例

示例1:在插入新记录前检查数据

假设我们有一个employees表,我们想在插入新员工记录之前检查员工的年龄是否大于18岁。

create trigger before_insert_employee
before insert on employees
for each row
begin
    if new.age <= 18 then
        signal sqlstate '45000' set message_text = 'employee age must be greater than 18.';
    end if;
end;

示例2:在更新记录后自动更新另一个表

假设我们有两个表,orders和order_history,每次更新orders表中的订单状态时,我们想将旧状态记录到order_history表中。

create trigger after_update_order
after update on orders
for each row
begin
    insert into order_history(order_id, old_status, new_status, change_date)
    values (old.order_id, old.status, new.status, now());
end;

示例3:在删除记录前检查是否有相关联的记录存在

假设我们有一个departments表和一个employees表,其中employees表有一个外键指向departments表。在删除一个部门之前,我们想检查该部门下是否有员工。

create trigger before_delete_department
before delete on departments
for each row
begin
    declare employee_count int;
    select count(*) into employee_count from employees where department_id = old.id;
    if employee_count > 0 then
        signal sqlstate '45000' set message_text = 'cannot delete department with existing employees.';
    end if;
end;

注意事项

权限‌:创建触发器需要相应的权限,通常是数据库管理员或具有相应权限的用户。

调试‌:触发器中的错误可以通过查看mysql的错误日志或使用show triggers;语句来检查触发器的状态和错误。

性能‌:虽然触发器非常有用,但它们可能会影响数据库性能,尤其是在高并发的情况下,因此需要谨慎使用。

替代方案‌:在某些情况下,可以考虑使用存储过程或应用程序逻辑来替代触发器,以避免可能的性能问题。

通过这些示例和解释,你应该能够开始使用mysql触发器来增强你的数据库应用了。

拓展:mysql触发器和函数的详细示例

mysql触发器和函数的详细示例

概述

  • 以下介绍mysql触发器和函数的详细示例及说明
  • 触发器是数据库的自动化规则,监听数据变化并自动干活。
  • 函数是封装好的计算逻辑,随用随调,帮你省去重复写代码的麻烦。

一、mysql 触发器示例

  • 触发器(trigger)是数据库在特定事件(insert/update/delete)发生时自动执行的一段代码。

1. 基本语法

create trigger trigger_name
{before | after} {insert | update | delete}
on table_name
for each row
begin
    -- 触发器逻辑
end;

2. 示例场景

场景1:自动填充创建时间

-- 在插入数据前自动设置 create_time 字段
create trigger before_insert_set_create_time
before insert on orders
for each row
begin
    set new.create_time = now();
end;

场景2:更新审计日志

-- 在更新用户表后记录变更日志
create trigger after_user_update
after update on users
for each row
begin
    insert into audit_log (action, old_value, new_value, timestamp)
    values (
        'update_user',
        concat('old: ', old.email),
        concat('new: ', new.email),
        now()
    );
end;

场景3:数据校验

-- 插入数据前检查年龄是否合法
create trigger before_insert_check_age
before insert on employees
for each row
begin
    if new.age < 0 then
        signal sqlstate '45000' 
        set message_text = '年龄不能为负数';
    end if;
end;

二、mysql 函数示例

  • 函数(function)是一段可重复使用的代码,接收参数并返回一个值。

1. 基本语法

create function function_name(param1 type, ...)
returns return_type
[deterministic | not deterministic]
begin
    -- 函数逻辑
    return value;
end;

2. 示例场景

示例1:计算折扣后的价格

-- 输入原价和折扣率,返回折扣后的价格
create function calculate_discounted_price(original_price decimal(10,2), discount_rate decimal(3,2))
returns decimal(10,2)
deterministic
begin
    declare discounted_price decimal(10,2);
    set discounted_price = original_price * (1 - discount_rate);
    return discounted_price;
end;
-- 使用函数
select calculate_discounted_price(100.00, 0.2); -- 返回 80.00

示例2:格式化电话号码

-- 将电话号码格式化为 xxx-xxxx-xxxx
create function format_phone_number(phone varchar(20))
returns varchar(20)
deterministic
begin
    return concat(
        substr(phone, 1, 3), '-',
        substr(phone, 4, 4), '-',
        substr(phone, 8, 4)
    );
end;
-- 使用函数
select format_phone_number('13812345678'); -- 返回 '138-1234-5678'

示例3:计算订单总价(含折扣)

-- 根据订单id计算总价(考虑折扣)
create function calculate_order_total(order_id int)
returns decimal(10,2)
reads sql data
begin
    declare total decimal(10,2);
    select sum(quantity * price * (1 - discount))
    into total
    from order_items
    where order_id = order_id;
    return total;
end;
-- 使用函数
select calculate_order_total(1001);

三、注意事项

  • 触发器
    • • 避免在触发器中执行耗时操作,可能影响性能。
    • • 使用 oldnew 关键字访问旧数据和新数据。
    • • 确保触发器逻辑不会导致无限循环(例如在 after update 触发器中更新同一张表)。
  • 函数
    • • 函数必须返回一个值。
    • • 使用 deterministic 声明确定性函数(相同输入固定输出),优化查询性能。
    • • 函数中可以使用条件语句(if)、循环(while)等逻辑。

四、总结

触发器适合处理数据一致性、审计日志、自动填充字段等场景。
函数适合封装复杂计算或格式化逻辑,提高代码复用性。

通过合理使用触发器和函数,可以简化应用程序逻辑并提高数据库的健壮性。

到此这篇关于mysql触发器写法及示例详解的文章就介绍到这了,更多相关mysql 触发器写法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com