mysql 开启bin-log 执行函数报错

DETERMINISTIC 不确定的
NO SQL 没有SQl语句,当然也不会修改数据
READS SQL DATA 只是读取数据,当然也不会修改数据
MODIFIES SQL DATA 要修改数据
CONTAINS SQL 包含了SQL语句

1、在mysql数据库中执行以下语句 临时生效重启后失效
   

set global log_bin_trust_function_creators=TRUE;

2、 在配置文件/etc/my.cnf的[mysqld]配置

log_bin_trust_function_creators=1

<think>嗯,用户问的是如何在MySQL中创建自定义函数,我得先回顾一下相关的知识。记得之前学过MySQL的自定义函数,和存储过程有点像,但函数必须返回一个值。首先,用户需要了解基本语法,比如CREATE FUNCTION,参数,返回值类型这些。然后可能还需要涉及到DELIMITER的使用,因为函数体里有多个语句,分号会冲突,所以得暂时修改分隔符。 对了,创建函数的时候需要确定函数的确定性,DETERMINISTIC或者NOT DETERMINISTIC,这个在引用里提到过。可能用户会遇到权限问题,所以得提醒他们要有CREATE ROUTINE权限。另外,函数里不能执行修改数据库的操作,只能进行计算,这点要说明清楚。 示例部分应该给一个简单的例子,比如计算两数之和,或者更复杂的像计算销售提成。这样用户能直观地看到结构。然后调用函数的方式,比如SELECT语句里使用。可能还需要注意函数创建时的错误处理,比如如果已经存在同名的函数,需要用DROP FUNCTION IF EXISTS先删除。 用户可能还关心如何查看和删除函数,所以应该补充这些步骤。比如用SHOW FUNCTION STATUS和DROP FUNCTION。另外,常见问题比如权限、语法错误、分隔符设置不正确这些,需要列出来帮助用户排查。 现在要检查引用的内容,确保每个步骤都有对应的引用支持。比如DELIMITER的使用在引用3里有例子,创建函数的语法在引用2里,确定性属性在引用2也有提到。确保引用标记正确,比如在DELIMITER部分加上[^3],在基本语法部分引用[^2]。 最后,生成相关问题的时候,要考虑用户可能的后续问题,比如性能优化、和存储过程的区别、递归函数的使用、调试方法以及查看所有自定义函数的方法。这些问题应该覆盖用户可能遇到的进一步疑问。</think>### 如何在 MySQL 中创建自定义函数 #### 一、创建自定义函数的基础语法 MySQL 自定义函数使用 `CREATE FUNCTION` 语法定义,需指定函数名、参数、返回值类型及函数体。基本语法如下: ```sql CREATE FUNCTION 函数名(参数1 数据类型, ...) RETURNS 返回值类型 [DETERMINISTIC|NOT DETERMINISTIC] BEGIN -- 逻辑代码 RETURN 结果; END ``` - **DETERMINISTIC**:表示函数对相同输入始终返回相同结果(如数学函数- **NOT DETERMINISTIC**:表示函数可能返回不同结果(如包含随机数或时间函数) #### 二、关键步骤详解(含示例) 1. **设置分隔符** 默认分号 `;` 会与函数体中的语句结束符冲突,需使用 `DELIMITER` 修改: ```sql DELIMITER // -- 临时修改为// ``` [^3] 2. **创建函数示例** 创建一个计算两数之和的函数: ```sql CREATE FUNCTION add_numbers(a INT, b INT) RETURNS INT DETERMINISTIC BEGIN DECLARE sum INT; SET sum = a + b; RETURN sum; END // ``` 恢复默认分隔符: ```sql DELIMITER ; ``` 3. **调用自定义函数** ```sql SELECT add_numbers(5, 3); -- 返回8 ``` #### 三、高级应用示例 创建一个根据销售额计算提成的函数: ```sql DELIMITER // CREATE FUNCTION calculate_bonus(sales DECIMAL(10,2)) RETURNS DECIMAL(10,2) DETERMINISTIC BEGIN IF sales > 100000 THEN RETURN sales * 0.15; ELSE RETURN sales * 0.1; END IF; END // DELIMITER ; ``` #### 四、注意事项 1. **权限要求**:用户需具备 `CREATE ROUTINE` 权限[^2] 2. **函数特性限制**: - 不能包含修改数据库状态的操作(如INSERT/UPDATE) - 必须通过 `RETURN` 语句返回值 3. **错误处理**:建议先删除已存在函数 ```sql DROP FUNCTION IF EXISTS 函数名; ``` #### 五、管理自定义函数 1. **查看函数定义**: ```sql SHOW CREATE FUNCTION 函数名; ``` 2. **查看所有函数**: ```sql SHOW FUNCTION STATUS WHERE Db = '数据库名'; ``` 3. **删除函数**: ```sql DROP FUNCTION 函数名; ``` #### 六、常见报错处理 | 错误场景 | 解决方案 | |---------|---------| | `#1418` 权限错误 | 添加 `DETERMINISTIC` 或设置全局变量 `log_bin_trust_function_creators=1` | | `#1064` 语法错误 | 检查分隔符设置和语句结束符是否匹配 | | `#1305` 函数不存在 | 确认函数名拼写是否正确,或是否在正确数据库中 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值