我有三列的SQL Server表:最好的方式,以避免增加重複數據庫
表1
col1 int
col2 int
col3 string
我對所有三列定義的唯一約束(col1, col2, col3)
現在,我有一個.csv文件,我想在該表中添加記錄,* .csv文件可以有重複的記錄。
我已經在上面的場景中搜索了各種避免重複的選項。以下是對我來說很好的三種選擇。請看看,並對每種方法的優缺點提出一些想法,以便我可以選擇最好的方法。
選項#1:
在首位避免重複而即將對象添加到從csv文件列表。我已經使用HashSet<T>
,這和下面的類型T的方法重寫:
public override int GetHashCode()
{
return col1.GetHashCode() + col2.GetHashCode() + col3.GetHashCode();
}
public override bool Equals(object obj)
{
var other = obj as T;
if (other == null)
{
return false;
}
return col1 == other.col1
&& col2 == other.col2
&& col3 == other.col3;
}
選項#2
有List<T>
代替HashSet<T>
。所有對象之後
刪除重複加入到List<T>
List<T> distinctObjects = allObjects
.GroupBy(x => new {x.col1, x.col2, x.col3})
.Select(x => x.First()).ToList();
選項#3
之後的所有對象被添加到DataTable
刪除重複。
public static DataTable RemoveDuplicatesRows(DataTable dataTable)
{
IEnumerable<DataRow> uniqueRows = dataTable.AsEnumerable().Distinct(DataRowComparer.Default);
DataTable dataTable2 = uniqueRows.CopyToDataTable();
return dataTable2;
}
雖然我沒有比較他們的運行時間,但我更喜歡選項#1,因爲我刪除重複的第一步 - 所以只需要什麼樣的向前邁進。
請分享你的看法,以便我可以選擇最好的一個。
非常感謝!
從csv獲取數據並批量將其插入到沒有唯一約束的臨時表中,使用sql刪除重複項,然後將沒有dups的數據移動到實際的最終表中是否更有效? –
^aka選項#4 – Jonesopolis
如果你使用選項1,我可能會改變你的'GetHashCode'以通過素數乘以屬性,就像這個[答案](http://stackoverflow.com/a/371348/2145211) – Harrison