![](/img/trans.png)
[英]Is it a good practice to use surrogate primary key even if the table contains only one column and that itself contains the unique values?
[英]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.