2016-04-29 56 views
0

我用bulk insert語法到日常的文件上傳到SQL,目前尋找途徑,以避免排duplicatesauto-incrementingID柱,並將其設置爲primary key。由於使用的表的說明:如何避免重複行的SQL後自動增量列

CREATE TABLE dupli 
(
ID int IDENTITY(1000,1) NOT NULL PRIMARY KEY, 
period date NOT NULL, 
fruits varchar(MAX) NOT NULL, 
num int NOT NULL, 
) 

假設dupli.csv包含:

4/20/2011, apple, 5

SQL自然檢索後的文件上傳:

1000¦2011-04-20¦apple¦5¦ 

的漏洞:如果有人,錯誤地上傳相同的文件牛逼檢查一些數據存在爲2011-04-20然後重複行創建爲

1001¦2011-04-20¦apple¦5¦ 

ex-ante ...

這看起來正常的ID一直auto-incremented。不過,我不知道是否有辦法,保持ID自動遞增,同時避免重複行?這意味着我可以得到:

1000¦2011-04-20¦apple¦5¦ 
1001¦2011-04-21¦apple¦5¦ 

...

,但從來沒有

1000¦2011-04-20¦apple¦5¦ 
1001¦2011-04-20¦apple¦5¦ 

否則bulk insert不執行。

目的是避免創建function如果執行bulk insert僅一次)之前每天的基礎上存在預先存在的數據來檢查。到目前爲止,這是唯一可以考慮保留上表結構並避免重複的方法。

在此先感謝

+1

您是否必須直接插入生產表?爲什麼不先插入到保存表中,檢查重複項,然後插入。在每次插入之後,可以將保持臺截斷。但是仍然可以有優化檢查所需的索引。 – BeaglesEnd

+0

直接插入對我來說聽起來是最簡單的實現,意識到「最簡單」方法並不總是最好的方法,因爲我一直堅持使用「重複」方法。 –

+0

你是如何啓動'bulk insert'的?從作業調用的存儲過程,另一個進程/應用程序,還是隻是執行腳本?您可以在程序中使用臨時表或表變量。使用臨時表,您仍然可以根據需要應用索引,但是對錶變量這樣做是有限的。 – BeaglesEnd

回答

0

爲什麼不創建,然後批量插入到一個臨時表。之後,您可以發出一個簡單的合併或(更簡單的)外部聯接插入語句來更新重複。一旦連接被丟棄並且連接丟失,臨時表將被丟棄。所以沒有整理工作要做。

using (var connection = new SqlConnection(Strings.connection_string)) 
     using (var command = new SqlCommand() { Connection = connection }) 
     { 
      command.CommandText = "CREATE TABLE #dupli (period date, fruits varchar(MAX), num int, primary key (period, fruits))"; 
      connection.Open(); 
      command.ExecuteNonQuery(); 

      //Now do your bulk insert to #dupli 

      // issue a merge statement (or simple left outer join insert) to update the target table 
     /* 
     insert into dupli(period, fruits, num) 
     select #dupli.period, #dupli.fruits, #dupli.num 
     from #dupli left outer join dupli 
     on #dupli.period = dupli.period 
     and #dupli.fruits = dupli.fruits 
     where dupli.ID is null 
     */ 
     } 
+0

謝謝。您是否確定所提倡的解決方案可以保證在執行了多次'dupli.csv'上的代碼之後不存在任何重複項,如上所示? –

+0

我編輯了我的答案,使其更清楚一點。將主鍵添加到臨時表可確保沒有重複項(將責任轉移回客戶端應用程序)。我相信代碼將在一個事務中執行 - 即使你有成千上萬的線程試圖插入數據,你也不會在輸出中得到重複。 –

+0

謝謝你,因爲你最新的'建議'/'編輯'直觀地對我更有意義。 –