2013-12-14 228 views
0

我有這種情況,我試圖弄清楚如何停止向db中插入重複數據。Mysql初始密鑰和唯一密鑰(防止重複數據)

我有表log,包括行:

設備ID,時間(這不是一次插入,但其發生的日誌的時間),內容

每個用戶都可以從提交與數據例如其設備ID

123ABC,2013年11月27日1時19分37秒,樣品文本

每個用戶可以使用xml協議從設備提交多達500個日誌。 因此,從控制面板頁面中,我可以選擇用戶(從此設備ID)並查看他們提交的日誌的總數(不同的設備ID,時間),因此我只能看到它們的唯一日誌,例如400個唯一日誌。 但是在後端mysql中他們有多達2000條記錄日誌,並且它們都從400條獨特的日誌中複製了5次。

  • 我不能讓設備ID爲唯一的,因爲1設備可以提交多次,它會停止插入數據,因爲每次可以是相同的設備ID。

  • 我無法組合唯一(設備ID和時間)。我認爲這會工作,但數據不會插入;它拒絕我的查詢。每個數據都有唯一的時間,內容但沒有設備ID ...

我該如何做這項工作?

如果我希望每個用戶繼續提交數據日誌,但不是重複的,並且只有來自同一設備ID的唯一數據日誌。

如果我僅選擇時間和內容作爲唯一索引。如果多個設備提交相同的日誌時間並且內容相同,它有時會失敗...

如何使其對每個設備ID唯一而不是其他設備ID唯一。

+0

和你在你的代碼中有什麼?在將代碼插入數據庫之前,應該防止代碼中出現重複項。您可以在該數據庫表中添加/擁有用戶標識嗎? – Hardy

+0

我做過了,但每個用戶都有一個重置按鈕,每次點擊它時,都會從開始一直重新提交日誌。重置按鈕就像重置時間設置,最近6個月回來,因此它將再次刷新最近6個月的所有日誌。另外,爲了防止日誌丟失,我們的設備上的代碼每次在互聯網連接上ping或超時都會重新提交數據,所以這可能會重複插入。我無法弄清楚這一點。看起來像是出於選擇 –

+0

我認爲問題在於這個要求對你來說並不清楚。 在這種情況下,您無法清楚實施。你能用簡單的話來解釋一下什麼是獨特的嗎? –

回答

1

我看不出爲什麼兩列上的常規復合唯一索引不起作用;

CREATE TABLE logs (
    log_id INT AUTO_INCREMENT PRIMARY KEY, 
    device_id VARCHAR(32), 
    time  DATETIME, 
    content VARCHAR(32) 
); 

CREATE UNIQUE INDEX uq_logs ON logs (device_id, time); 

An SQLfiddle to test with

-- First insert 
INSERT INTO logs (device_id, time, content) VALUES 
    ('123ABC', '2013-11-27 01:19:37', 'sample text'); 

-- New time, ok  
INSERT INTO logs (device_id, time, content) VALUES 
    ('123ABC', '2013-11-27 01:19:47', 'sample text'); 

-- Duplicate of #1, fails 
INSERT INTO logs (device_id, time, content) VALUES 
    ('123ABC', '2013-11-27 01:19:37', 'sample text'); 
+0

我知道這個要求表明他想要阻止dups。但是,爲了表現得像日誌,你不應該這樣做。另外,獨特的(任何)指數表現命中是不必要的。但讚譽爲自動增量代理鍵。最後一件事,您可能需要注意發送日誌的設備的時區。 –

1

嘗試這樣的:

  • 創建表的字段batch_iddevice_id
  • 數據創建用戶submittes MD5哈希(整個XML)
  • 添加記錄創建的表與MD5哈希和設備ID

然後你可以檢查是否內容是alre ady之前通過檢查內容哈希與數據庫哈希來提交。

+0

我沒有權限編輯客戶端上的代碼,但僅限於數據庫。是否有解決方案,而不是有選擇地創建MD5上的列?然後創建該哈希的唯一索引? –

+0

不,你應該有權訪問插入數據的php代碼,如果你想讓它像你所描述的那樣工作的話。 – Hardy