1. 程式人生 > >Error-based

Error-based

鍵值 再計算 group for 主鍵 其中 隨機數 wid 分享

將聚合函數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