Mysql-TREE实现
2017-08-20 20:30
176 查看
Mysql 官方并没有实现树结构获取数据的方案,但是可以通过Mysql提供的函数 FIND_IN_SET(str,strlist) 递归实现;
FIND_IN_SET(str,strlist) 函数介绍
假如字符串str 在由N 子链组成的字符串列表strlist 中, 则返回值的范围在 1 到 N 之间 。一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则 FIND_IN_SET() 函数被优化,使用比特计算。如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。 这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。
mysql> SELECT FIND_IN_SET(‘b’,’a,b,c,d’);
TREE实现
// 4 查询结果
// 5 可能遇到问题
创建函数问题描述:
ERROR 1418 (HY000): 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)
问题分析:
这是我们开启了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;
my.ini 设置:
[mysqld]
加上log_bin_trust_function_creators=1
FIND_IN_SET(str,strlist) 函数介绍
假如字符串str 在由N 子链组成的字符串列表strlist 中, 则返回值的范围在 1 到 N 之间 。一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则 FIND_IN_SET() 函数被优化,使用比特计算。如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。 这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。
mysql> SELECT FIND_IN_SET(‘b’,’a,b,c,d’);
TREE实现
// 1 创建表 CREATE TABLE IF NOT EXISTS t_tree_table ( `id` INT (32) AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR (64) COMMENT '名称', pId VARCHAR (32) );
// 2 创建递归存储过程 DROP FUNCTION IF EXISTS `getChildLst`; CREATE FUNCTION `getChildLst`(rootId INT) RETURNS varchar(1000) BEGIN DECLARE sTemp VARCHAR(1000); DECLARE sTempChd VARCHAR(1000); SET sTemp = '#'; SET sTempChd =cast(rootId as CHAR); WHILE sTempChd is not null DO SET sTemp = concat(sTemp,',',sTempChd); SELECT group_concat(id) INTO sTempChd FROM t_tree_table where FIND_IN_SET(pId,sTempChd)>0; END WHILE; RETURN sTemp; END;
// 3 使用 SELECT * FROM t_tree_table WHERE FIND_IN_SET(id, getChildLst('1'));
// 4 查询结果
// 5 可能遇到问题
创建函数问题描述:
ERROR 1418 (HY000): 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)
问题分析:
这是我们开启了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;
my.ini 设置:
[mysqld]
加上log_bin_trust_function_creators=1
相关文章推荐
- MySQL中MyISAM和InnoDB对B-Tree索引不同的实现方式
- 基于ExtJs6前台,SpringMVC-Spring-Mybatis,resteasy,mysql无限极表设计,实现树状展示数据(treepanel)
- MySQL+Heartbeat+DRBD+LVS+keepalived实现数据库高可用群集
- Mysql实时备份实现方法
- mysql中sql实现查询当天、昨天、本月、季度的语句
- mysql实现topN top1
- Mysql case when 实现行转列时为什么要用max()或者其他聚合函数
- java+mysql实现保存图片到数据库,以及读取数据库存储的图片
- mysql 5.6 从陌生到熟练之_数据库备份恢复的实现方法
- behaviac是腾讯对行为树(Behavior Tree)的一个实现方案。该方案包括编辑器(Designer)和运行时库(Runtime):编辑器用来编辑和调试行为树,运行时库用来解释和执行编辑器生
- MySql服务AB复制的实现AB/ABB/ABC
- DevExpress实现禁用TreeListNode CheckBox的方法
- 如何在mysql中实现update字段
- servlet + JSP+ mysql实现文件的上传
- 通过 XtraBackup 实现不停机不锁表搭建MySQL主从同步
- mysql主从复制(三)之实现读写分离
- Linux 实现MySQL+Keepalive 高可用
- 基于Mysql的Sequence实现
- Mysql实现oracle decode()函数
- 树状树组(Binary Indexed Tree (BIT))的C++部分实现