自动递增列后如何避免 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
*/
}
我使用 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
*/
}