当前位置: 代码网 > it编程>数据库>Mysql > 全面解析MySQL数据库如何创建自定义函数

全面解析MySQL数据库如何创建自定义函数

2026年09月23日 Mysql 我要评论
前言在mysql中,很多人会混淆自定义函数(udf,用户自定义函数)和存储过程,二者虽然都属于数据库可编程对象,但使用场景、语法限制、调用方式差异很大。内置函数如sum()、date_format()

前言

在mysql中,很多人会混淆自定义函数(udf,用户自定义函数)和存储过程,二者虽然都属于数据库可编程对象,但使用场景、语法限制、调用方式差异很大。

内置函数如sum()date_format()可以直接拿来用,但如果业务有固定的计算逻辑、格式化规则,反复写重复sql就很繁琐,这时就可以自己编写mysql自定义函数,封装逻辑,一行调用。

注意:mysql自定义函数有返回值,必须返回单个值;不能返回结果集,这是和存储过程最核心的区别。

一、自定义函数基础语法

创建函数

delimiter //
create function 函数名(参数名 参数类型) 
returns 返回值类型
[deterministic]
begin
    -- 函数业务逻辑
    return 返回的数据;
end //
delimiter ;

关键字说明:

  1. delimiter //:修改语句结束符。默认mysql以;作为结束标记,函数体内部会用到分号,所以临时改成//,函数创建完成再恢复;
  2. create function:创建自定义函数。
  3. 入参:只支持in输入参数,没有out、inout参数(存储过程才有)。
  4. returns必须声明返回值的数据类型,int、varchar、datetime等。
  5. deterministic(可选):确定函数。相同输入一定返回相同结果,不读随机数、当前时间这类动态数据,开启有助于优化器优化。
  6. return:函数内部必须有return语句,返回结果。

查看、删除函数

-- 查看数据库下所有自定义函数
show function status where db = '你的数据库名';

-- 删除自定义函数
drop function if exists 函数名;

二、简单实战示例

示例1:最简单的数字计算函数

需求:传入分数,返回等级。比如 >=90优秀,>=80良好,>=60及格,其余不及格。

delimiter //
create function get_score_level(score int)
returns varchar(20)
deterministic
begin
    declare level varchar(20);
    if score >= 90 then
        set level = '优秀';
    elseif score >= 80 then
        set level = '良好';
    elseif score >= 60 then
        set level = '及格';
    else
        set level = '不及格';
    end if;
    return level;
end //
delimiter ;

调用方式(和内置函数一样,放在select里)

select get_score_level(86);
-- 结合表查询
select name, score, get_score_level(score) as level from student;

示例2:文本处理函数

需求:传入字符串,去掉多余空格,转为大写返回

delimiter //
create function str_upper_trim(str varchar(255))
returns varchar(255)
deterministic
begin
    return upper(trim(str));
end //
delimiter ;

调用:

select str_upper_trim('  hello mysql ');

三、自定义函数 vs 存储过程(重点区分)

对比项自定义函数function存储过程procedure
返回值必须有且只能返回单个值无返回值,可以用out输出多个参数
调用方式select 函数()call 存储过程()
参数类型仅支持in输入参数支持in/out/inout三种参数
返回结果集不能返回多行结果集可以查询返回结果集
事务不建议在函数内使用事务支持事务、复杂业务逻辑
使用场景简单计算、字段格式化、转换批量dml、复杂多步骤业务

一句话总结:简单计算、字段转换用自定义函数;多表更新、批量操作、复杂业务流程用存储过程。

四、适用场景

  1. 字段格式化:统一对日期、文本、编码做清洗转换,查询时直接调用,避免每个sql重复写一堆case、字符串处理逻辑。
  2. 固定规则计算:分数评级、税率计算、编码生成,规则写在函数里,后续修改只改函数,不用改所有业务sql。
  3. 复杂字段判断:多条件的标签判定,比如根据金额、时间自动打业务标签。

五、重要限制与避坑

  1. 禁止在函数里做dml操作(insert/update/delete),容易出现锁、主从同步异常,mysql不推荐,部分版本直接限制。
  2. 不能返回多行数据,想查询多条记录不能用自定义函数,改用存储过程。
  3. 函数内尽量避免查询大表,函数会每行都执行,放在where或者select字段里,大数据量极易性能雪崩。
  4. 权限问题:创建函数需要 create routine 权限,线上数据库最小权限原则,不要随意开放。
  5. 注意字符集、长度,varchar类型如果返回内容超出定义长度会截断。

六、什么时候不要用自定义函数

  • 需要批量新增、更新、删除数据 → 存储过程
  • 需要返回多行查询结果 → 存储过程
  • 逻辑很重、关联多张大表 → 尽量写原生sql,函数会造成每行执行,索引失效风险高
  • 逻辑经常频繁变更:函数修改需要ddl锁,高并发生产环境要谨慎。

结尾

mysql自定义函数适合封装轻量、无副作用的计算转换逻辑,使用简单,调用方式和内置函数保持一致。但它不是万能的,千万不要把复杂业务全部塞进函数,尤其是大数据量查询场景,很容易引发性能问题。开发前分清函数和存储过程的适用边界,才能发挥它的价值。

到此这篇关于全面解析mysql数据库如何创建自定义函数的文章就介绍到这了,更多相关mysql自定义函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

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

发表评论

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