数据库创建函数报:
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
百度翻译结果:
此函数在其声明中没有确定性、无SQL或读取SQL数据,并且启用了二进制日志记录(您*可能*希望使用不太安全的log\u bin\u trust\u function\u creators变量)
说明:
这是我们开启了bin-log, 我们就必须指定我们的函数是否:
1 DETERMINISTIC 确定性的
2 NO SQL 没有SQl语句,当然也不会修改数据
3 READS SQL DATA 只是读取数据,当然也不会修改数据
4 MODIFIES SQL DATA 要修改数据
5 CONTAINS SQL 包含了SQL语句
其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。
解决方法:
数据库执行下面语句:
set global log_bin_trust_function_creators=TRUE;
实例:
eg:获取某个节点上所有上级路径
递归上级函数:
delimiter $$
USE `material_dev`$$ ##数据库名称
DROP FUNCTION IF EXISTS `getCategory`$$
CREATE DEFINER=`root`@`%` FUNCTION `getCategory`(self_Id VARCHAR(40))
RETURNS VARCHAR(1000) CHARSET utf8 ##定义返回值类型 varchar(4000)
BEGIN ##函数开始
DECLARE sTemp text(40000); ##定义一个varchar类型的参数
DECLARE sTempChd text(40000); ##定义一个varchar类型的参数
DECLARE counts int;
SET sTemp = ""; ##给sTmp赋值
SET sTempChd =self_Id;
set counts = 0;
WHILE sTempChd IS NOT NULL DO ##循环体
SET sTemp = CONCAT(sTempChd,"/",sTemp);
##拼接sTemp
select count(*) INTO counts FROM t_category WHERE id = sTempChd;
IF (counts=0)THEN
set sTempChd = NULL ;
else
SELECT parent_id INTO sTempChd FROM t_category WHERE id = sTempChd;
END IF;
##根据父节点,查询出该父节点下的所有子节点的id,支持多级查询
END WHILE;
SET sTemp = left(sTemp,length(sTemp)-1);
RETURN right(sTemp,length(sTemp)-2);
END$$
DELIMITER
正式SQL运行:
SELECT t1.id,t1.name,t2.name AS parentName,getCategory(t1.id) AS path FROM t_category t1 LEFT JOIN t_material_category t2 ON t1.parent_id = t2.id
运行结果: