2016-09-28 73 views
0

我有一個表 (ID,位置,時間戳,類型,值)PHP如何檢查存在之前插入數據到mysql

位置/時間戳/類型可以複製,
但位置+時間戳+類型是獨一無二的


1, 「巴黎」,1474986000, 「一」, 「100」
2, 「倫敦」,1474986000, 「一」, 「90」
3, 「巴黎」,1474986000「 「b」,「12」
4,「倫敦」,1474986000,「b」,「13」
5「Paris」1474990000「a」100「
6」London「1474990000」a「100」
7「Paris」1474990000「a」100 「
8,‘倫敦’,1474990000,‘一’,‘100’


我試圖檢查使用select語句插入之前就已經存在,但我有> 100000的記錄,它花了很多時間檢查

任何其他解決方案可以解決這個問題?謝謝〜

+2

然後在這些字段上放上一個索引 – RiggsFolly

+0

或者編寫INSERT查詢並處理重複錯誤爲OK – RiggsFolly

+0

請檢查本文檔: http://dev.mysql.com/doc/refman/5。7/EN /插入式,duplicate.html –

回答

1

您可以使用INSERT IGNORE保持腳本運行,並且不會插入重複鍵。或者你可以使用INSERT ... ON DUPLICATE KEY...

2

如果在列的該組合的唯一約束,假定這些列都聲明NOT NULL ...

您可以創建一個唯一索引。該索引將加快對現有行的「搜索」,並帶有適當的SELECT語句。

CREATE UNIQUE INDEX mytable_UX1 ON mytable (location, timestamp, type) 

但如果你有一個唯一索引定義,首要目標就是要添加缺少的行,你可以使用INSERT IGNORE

INSERT IGNORE INTO mytable (...) VALUES (...), (...) 

嘗試插入一行違反了獨特約束不會拋出錯誤。 IGNORE關鍵字導致MySQL不僅忽略重複的關鍵違規,而且還將其他錯誤轉化爲警告。

如果使用IGNORE關鍵字,則忽略執行INSERT語句時發生的錯誤。例如,如果沒有IGNORE,表中重複表中現有的UNIQUE索引或PRIMARY KEY值的行會導致重複鍵錯誤,並且語句會中止。使用IGNORE時,該行將被丟棄並且不會發生錯誤。忽略錯誤可能會產生警告,但重複鍵錯誤不會。

我用另一種技術是執行INSERT自身內部的檢查,使用INSERT ... SELECT ... SELECT語句包括反連接,以消除已存在的行。此方法僅檢查表中已存在的行,而不檢查可能由SELECT語句產生的「重複」。

相關問題