2016-12-29 66 views
0

我有權訪問我們每天從雲服務中檢索並存儲在MySQL數據庫中的報表數據集(我無法控制),以運行高級報告和本地與第三方數據可視化軟件相結合的報告。如何將自動遞增值附加到重複值?

數據通常在id字段上具有重複值,這些值在與其他表進行數據分析時會產生問題。

例如:

+-------------+----------+------------+----------+ 
| workfile_id | zip_code | date | total | 
+-------------+----------+------------+----------+ 
|  78002 | 90210 | 2016-11-11 | 2010.023 | 
|  78002 | 90210 | 2016-12-22 | 427.132 | 
+-------------+----------+------------+----------+ 

Workfile_id是重複的,因爲這是同樣的工作,但在工作中更多的工作在不同的月份比原來的工作進行。而不是爲作業創建另一個工作文件標識的軟件,而是使用相同的工作文件標識。

做與workfile_id其他表的連接是有問題的,當同一個ID的一個以上存在,所以我想知道是否可以做兩件事情之一:

  1. 請重複workfile_id獨特。當找到重複項時,讓sql將數字附加到工作文件ID。第一次重複(或第二次出現相同的工作文件ID)將需要在工作文件ID末尾附加.01。然後,如果插入了另一個副本,它將需要自動遞增附加數字,例如0.02,以此類推,隨後重複使用workfile_id。這種方法最適合我們的數據,但我很好奇,從性能的角度來看,這對服務器來說有多困難。如果我可以安排在插入數據後進行更改以加速初始數據插入,那將是理想的。
  2. 總計列數和移除重複的workfile_id行。有一個任務標識重複的workfile_ids並彙總重複項的財務列,用新的總和替換原始總數,並在列合併後刪除「新行」。 從數據保存的角度來看,這比較麻煩,但如果第一個解決方案不可行,則可以接受。

我的假設是,會有讓服務器比較新workfile_id值,每一次數據插入現有的所有worlfile_id值顯著的開銷,但我們的數據是小,新的數據只能每天插入一次,在1 :上午30點,並且保留重複的workfile_id搜索插入最近6個月內的行也應該是可行的。

發現複製在列(workfile_id)附加一個自動遞增值到workfile_id可能?

編輯: 我很難讓我的觸發器基於sdsc81的答案工作。 任何想法?

DELIMITER // 

CREATE TRIGGER append_subID_to_workfile_ID_salesjournal 
AFTER INSERT 
    ON salesjournal FOR EACH ROW 

BEGIN 
    SET @COUNTER = (SELECT (COUNT(*)-1) FROM salesjournal WHERE workfile_id = NEW.workfile_id); 
    IF @COUNTER > 1 THEN 
     UPDATE salesjournal SET workfile_id = CONCAT(workfile_id, @COUNTER) WHERE id = NEW.id; 
    END IF; 

END;// 

DELIMITER ; 

很難知道觸發器是否完全不工作,或者只是觸發器中的代碼不工作。我在插入時沒有錯誤。有什麼辦法可以調試觸發錯誤嗎?

回答

0

好了,一切是更多鈔票;)

你不控制數據集,但你可以modifify數據庫,對不對? 然後你可以使用之後的每插入一個新值,並更新它,如果它重複的話。喜歡的東西:

SET @COUNTER = (SELECT (COUNT(*)-1) FROM *your_table* WHERE workfile_id = NEW.workfile_id); 
IF @COUNTER > 1 THEN 
    UPDATE *your_table* SET workfile_id = CONCAT(workfile_id, @COUNTER) WHERE some_unique_id = NEW.some_unique_id; 
END IF; 

如果有一天只有一個插入,且有被定義在workfile_id值的索引,那麼它不應該是你的服務器的任何問題都沒有。

此外,您還可以實現第二個解決方案,這樣做的:

DELIMITER // 

CREATE TRIGGER append_subID_to_workfile_ID_salesjournal 
AFTER INSERT ON salesjournal FOR EACH ROW 

BEGIN 
SET @COUNTER = (SELECT (COUNT(*)-1) FROM salesjournal WHERE workfile_id = NEW.workfile_id); 
IF @COUNTER > 1 THEN 
    UPDATE salesjournal SET total = total + NEW.total WHERE workfile_id = NEW.workfile_id AND id <> NEW.id; 
    DELETE FROM salesjournal WHERE id = NEW.id; 
END IF; 

END;// 

DELIMITER ; 

希望這有助於。

+0

如果您需要添加的值爲2位數,那麼您可以使用類似於SET @COUNTER = CONCAT('0',@COUNTER);'然後SET'@COUNTER = SUBSTR(@COUNTER, LENGTH(@COUNTER - 1));','UPDATE your_table ...'指令前。這很混亂,但應該做的伎倆。乾杯 – sdsc81

+0

是的,如果我不清楚,我很抱歉。我完全控制目標數據庫。我不是交易所的數據庫管理員,所以我不清楚如何完成這樣的事情。我今天淹沒了,但我會盡快測試你的方法,並選擇它作爲正確的,如果它的工作。感謝您及時的回覆。 – tephlon

+0

嗨!我正在仔細檢查,看到我糾正了查詢。順便問一下,表格中的所有字段都是?或者你有一個標識每行的unike * id *? (我的意思是,像一個自動增量值)。因爲這將需要正常工作。讓我知道。 – sdsc81