尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MySQL中如何编写带有循环的函数_MySQL函数流程控制技巧

MySQL中如何编写带有循环的函数_MySQL函数流程控制技巧 MySQL函数支持WHILE、REPEAT、LOOP但需5.7版本及CREATE ROUTINE权限log_bin开启时须声明DETERMINISTIC/READS SQL DATA/NO SQL否则报ERROR 1418。MySQL函数里不能用WHILE或REPEAT先确认版本和权限MySQL函数确实支持WHILE、REPEAT、LOOP但前提是你用的是5.7推荐8.0且当前用户有CREATE ROUTINE权限。常见错误是执行CREATE FUNCTION时报错ERROR 1418本质不是语法不支持而是log_bin开启时MySQL强制要求函数声明为DETERMINISTIC或NO SQL——否则拒绝创建。检查是否启用二进制日志SHOW VARIABLES LIKE log_bin;创建时必须显式声明DETERMINISTIC确定性或READS SQL DATA只读或NO SQL无SQL临时绕过仅测试环境SET GLOBAL log_bin_trust_function_creators 1;但生产环境禁用WHILE循环写法变量初始化和边界控制最容易出错MySQL函数中所有变量必须用DECLARE在BEGIN后第一行声明且WHILE条件判断依赖的变量必须在循环内主动更新否则就是死循环。典型现象是调用函数卡住、CPU飙升或者返回NULL因超时被中断。变量必须初始化DECLARE i INT DEFAULT 1;不写DEFAULT则初始值为NULL参与数值比较会全为FALSE循环体里必须修改判断变量SET i i 1;漏掉这句就无限循环条件建议用而非code避免因步长/初值偏差跳过终止条件DELIMITER $$CREATE FUNCTION sum_to_n(n INT) RETURNS INTREADS SQL DATADETERMINISTICBEGIN DECLARE i INT DEFAULT 1; DECLARE s INT DEFAULT 0; WHILE i n DO SET s s i; SET i i 1; -- 这句不能少 END WHILE; RETURN s;END$$DELIMITER ;REPEAT比WHILE更适合“先执行再判断”的场景当逻辑天然需要至少执行一次比如解析逗号分隔字符串、逐个提取子串REPEAT ... UNTIL比WHILE更直白也更少因初始状态误判导致跳过执行。但要注意UNTIL后的条件是“满足即退出”语义和WHILE相反容易写反。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。
返回列表