MYSQL第一次创建函数遇到问题

数据库创建函数报:

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

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值