如何在自动递增列后避免SQL中的重复行

时间:2016-04-29 12:04:50

标签: sql-server csv bulkinsert

我使用bulk insert语法将每日文件上传到SQL,目前正在寻找在duplicates auto-incrementing列之后避免行ID的方法并将其设置为primary key。作为所用表格的说明:

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¦

漏洞:如果有人错误地上传了同一个文件而没有检查ex-ante是否存在2011-04-20的某些数据,那么会创建一个重复的行

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

依旧......

这似乎正常,IDauto-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 个答案:

答案 0 :(得分:0)

为什么不创建,然后批量插入临时表。之后,您可以发出一个简单的合并或(甚至更简单的)外部联接插入语句来更新dupli。一旦连接被丢弃并且连接丢失,临时表将被丢弃。所以没有整理工作。

 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
         */
        }