floor rand group by 缺一不可
报错原理 floor(rand(0)*2)x 中floor负责把生成的随机数的小数去掉
但是(0)*2严格来说不算随机数 他的生成形式基本为011
所以能肯定导致报错 如果是rand()*2就会不可控
我是这么理解的:它一共有五次操作 如下:
由011011的这种形式 第一个生成的数字是0 他会检查有没有为0的键名(key) 结果当然是没有(第一次操作) 所以会插入一个虚拟表
但是在插入过程中要再取一次group by 后面的值 即再进行一次运算(第二个生成的数字是1) 所以输入的数据 key=1 value=1(第二次运算)
第三个生成的数字是1(第三次运算) 但是检查处key=1已经有了怎么办? 那就用count的方法把value+1=2 即key=1 value=2(第四次运算)
不要被上面搞晕了 一次语句执行相当于两次运算 第一次结果 1,1 第二次结果1,2
最后是第五步运算了 也就是关键所在 这时相当于一个循环了 又从头开始执行 但是结果也是1,1 已经有了重复了怎么办?所以就出错了
此时就会抛出主键冗余的异常,也就是所谓的floor报错
updataxml()我是这么理解的 它的固定格式是updataxml(1,2,3) 1和3不是关键 而2是xpath格式的路径 但是我们通常借助concat来拼接sql语句 包括~这些因为格式不对所以出错
如果以上理解有误 欢迎各位大佬指出