首页 > 代码库 > Error-based
Error-based
将聚合函数count()和group by语句联合起来迫使sql查询语句返回错误
须知:
floor:函数只返回整数部分,小数部分舍弃。
round:函数四舍五入,大于0.5的部分进位,不到则舍弃。
floor(rand(0)*2)前面产生的随机数是确定的011011...
1>mysql在遇到select count(*) from tables group by x;这语句的时候会建立一个虚拟表
(其中key是主键,不可重复)
2>取第一条数据,执行floor(rand(0)*2),发现结果为0(第一次计算),查询虚拟表,发现0的键值不存在,则floor(rand(0)*2)会被再计算一次,结果为1(第二次计算),插入虚表,第二次计算是计算键值(主键)
查询第二条记录,再次计算floor(rand(0)*2),发现结果为1(第三次计算),查询虚表,发现1的键值存在,所以floor(rand(0)*2)不会被计算第二次,直接count(*)加1
查询第三条记录,再次计算floor(rand(0)*2),发现结果为0(第4次计算),查询虚表,发现键值没有0,进行第二次键值得计算,结果为1,因为主键不可重复,所以报错([Err] 1062 - Duplicate entry ‘1‘ for key ‘group_key‘),所以至少要三条数据才可以,确定出错
a>floor(rand()*2)产生的随机数不确定,所以可能只需要两条记录就出错了,如下
注意:如果是select count(*),floor(rand(0)*2) from user group by 2;可以看成select count(*) from user group by floor(rand(0)*2)
Error-based