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

How to avoid duplicate rows in SQL after auto-incrementing a column

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

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¦

等等...

这看起来很正常,因为 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 之前每天检查是否存在预先存在的数据(仅一次 ).到目前为止,这是我能想到的唯一方法来保留上述 table 的结构并避免重复。

提前致谢

为什么不创建,然后批量插入临时 table。之后,您可以发出一个简单的合并或(甚至更简单的)外连接插入语句来更新重复项。一旦连接被处理并且连接丢失,temp table 将被删除。所以没有整理工作要做。

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