2016-04-05 50 views
0

我有以下結構簡單的表,很多行:如何在我的MySQL表中永久地洗牌ID?

id  | name | title | 
------------------------------ 

需要與其他值來代替id,換句話說,我需要永久洗牌我的表。我需要運行什麼查詢?這個查詢我需要運行一次......不管需要多長時間或記憶。

+1

你能給現有的'id'添加一個隨機數嗎?或者你想排列他們? – ritesht93

+0

隨機排列*物理*還是隻需要更改''id''列? – mmuzahid

+0

我需要洗牌*物理*,整個集ID可能與以前相同,但它不必。我目前的'id'範圍是從1 - 800? –

回答

2

考慮到你的行大小是800,你可以d類似於波紋管:

  • 創建一個包含表的所有記錄的臨時表。

    例如CREATE TABLE TMP_TABLE (SELECT * FROM YOUR_TABLE)

  • DROP TABLE YOUR_TABLE;

  • CREATE TABLE YOUR_TABLE (SELECT * FROM TMP_TABLE ORDER BY RAND())
  • DROP TABLE TMP_TABLE;
+0

我的列ID確實是'自動增量'。它會改變什麼嗎?:) –

+1

@BartłomiejSemańczyk,它不應該。 – shmosel

+0

@BartłomiejSemańczyk,我認爲沒有。 – mmuzahid

2

下面的查詢應該做的是以下幾點:

  • 整個ID組會和以前一樣,只是洗牌的ID;
  • tbl是一個更新
  • tbl2生成用於tbl
  • tbl3生成隨機與tbl2.row_num1 = tbl3.row_num2隨機ROW_NUM ROW_NUM(以上述不同)爲tbl3
  • ,洗牌完成
UPDATE tbl INNER JOIN 
    (SELECT *, (@rm1 := @rm1 + 1) as row_num1 FROM tbl CROSS JOIN (SELECT @rn1 := 0) param ORDER BY RAND()) tbl2 
     ON tbl.id = tbl2.id 
    INNER JOIN 
    (SELECT *, (@rm2 := @rm2 + 1) as row_num2 FROM tbl CROSS JOIN (SELECT @rn2 := 0) param ORDER BY RAND()) tbl3 
     ON tbl2.row_num1 = tbl3.row_num2 
SET tbl.id = tbl3.id; 
+0

你能解釋一下它是什麼嗎?:) –

+0

@DylanSu他的意思是'it' :) – shmosel

+0

@shmosel正是:) –

0

您可以使用數據庫VIEW使用洗牌邏輯

否則使用另一個表來備份當前表你的目的,然後SELECT洗牌行從備份表。然後TRUNCATE您的表,然後從備份表的選擇查詢中插入shuffle行。