2016-03-14 101 views
2

我有一個MySQL表正是如此定義:確保表格只包含唯一值的某些字段

CREATE TABLE Data (
    ID BIGINT(20) NOT NULL AUTO_INCREMENT, 
    Unique_Hash BINARY(16) NOT NULL, 
    Size BIGINT(20) NOT NULL, 
    DateAdded DATETIME NOT NULL, 
    PRIMARY KEY (ID), 
    INDEX (Unique_Hash) 
); 

我希望填充此表1000的記錄,但Unique_Hash /尺寸對不應該在被添加另一個記錄。相反,我想確保如果任何匹配現有Unique_Hash/Size值的新記錄被忽略。這是DateAdded字段,它打破了我的ON DUPLICATE IGNORE參數。

如何安全地將數據導入到此表中,以確保我的記錄相對於我的Unique_Hash和Size字段是唯一的?

回答

0

在Unique_Hash和Size字段上創建一個多列唯一索引。這肯定會阻止將具有相同數據的任何條目插入表中。

在導入數據時,您可以使用insert ignore ...語句忽略由於唯一索引衝突而在插入期間收到的任何錯誤。那些將被報告爲警告。

只是要注意使用ignore option的副作用:

的數據轉換將觸發錯誤中斷的聲明,如果 IGNORE沒被指定。使用IGNORE時,將無效值調整爲 最接近的值並插入;會產生警告,但 聲明不會中止。您可以使用mysql_info()API函數確定實際插入表中的行數。

0

您可以在表確保YOUT兩列的唯一性條件添加索引:

ALTER TABLE `Data` ADD UNIQUE `Unicity` (`Unique_Hash`, `Size `); 

通過這個說明您對將要翻過桌子獨特(沒有重複的對可插入) 。如果試圖插入重複對你會得到這樣的錯誤:

#1062 - Duplicate entry 'XXX-XXXX' for key 'Unicity' 

另一種解決辦法是使插入之前消除重複對。 爲此,您可以使用http://openrefine.org/ 以前的Google Refine。我曾爲此類任務使用過一次,並且我有一些相當不錯的結果。

我跳它會幫助你。

-1

這裏是我做了什麼,這似乎已經解決了我的問題:

我(重新)定義我的表:

CREATE TABLE數據( ID BIGINT(20)NOT NULL AUTO_INCREMENT, Unique_Hash BINARY (16)NOT NULL, 尺寸BIGINT(20)NOT NULL, DateAdded S/DATETIME/TIMESTAMP/DEFAULTS/NOT NULL/CURRENT_TIMESTAMP/, PRIMARY KEY(ID), s/INDEX/UNIQUE KEY/(Unique_Hash) );

現在我可以導入例如數據:

INSERT INTO IGNORE數據(Unique_Hash,尺寸)SELECT散列作爲Unique_Hash,尺寸爲溫度;

這會自動添加CURRENT_TIME字段,以及防止導入我的Temp表中的模糊。

+0

不,這樣不僅可以防止重複項按照您在問題中的定義進行添加,因爲您只將unique_hash字段定義爲唯一索引,而在問題中您將unique_hash和size的組合作爲唯一性的要求進行了描述。你的回答與你自己的問題不一致。 – Shadow

相關問題