簡體   English   中英

確保表僅包含某些字段的唯一值

[英]Ensuring table contains only unique values for certain fields

我因此定義了一個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 / Size對。 相反,我想確保是否忽略了與我現有的Unique_Hash / Size值匹配的任何新記錄。 這是DateAdded字段,它破壞了我的ON DUPLICATE IGNORE參數。

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

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

導入數據時,您可以使用insert ignore ...語句忽略由於唯一索引沖突而在插入過程中收到的任何錯誤。 這些將被報告為警告。

請注意使用ignore選項的副作用:

如果未指定IGNORE,則會觸發錯誤的數據轉換將中止該語句。 使用IGNORE,無效值將調整為最接近的值並插入; 產生警告,但該語句不會中止。 您可以使用mysql_info()C API函數來確定表中實際插入了多少行。

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

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

使用此說明,您的配對將在表中是唯一的(不能插入重復的配對)。 如果您嘗試插入重復對,則會出現此錯誤:

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

另一種解決方案是在插入之前消除重復的對。 為此,您可以與http://openrefine.org/(以前稱為Google Refine)一起使用。 我曾經為這種類型的任務使用過它,但是我取得了一些不錯的結果。

希望對您有幫助。

這是我所做的,似乎可以解決我的問題的方法:

我將表重新定義為:

創建表數據(ID BIGINT(20)非空AUTO_INCREMENT,Unique_Hash BINARY(16)非空,Size BIGINT(20)非空,DateAdded s / DATETIME / TIMESTAMP / DEFAULT s / NOT NULL / CURRENT_TIMESTAMP / ,主鍵(ID) , s / INDEX / UNIQUE KEY / (Unique_Hash));

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

插入IGNORE INTO數據(Unique_Hash,Size)選擇Hash作為Unique_Hash,Size FROM Temp;

現在,這會自動添加CURRENT_TIME字段,並防止從我的Temp表導入重復項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM