I have a windows service which basically watches a folder for any CSV file. Each record in the CSV file is inserted into a SQL table. If the same CSV file is put in that folder, it can lead to duplicate record entries in the table. How can I avoid duplicate insertions into the SQL table?
问问题
1038 次
3 回答
1
尝试,INSERT WHERE NOT EXISTS
其中和是相关列,和是相关值。a
b
c
@a
@b
@c
INSERT INTO table
(
a,
b,
c
)
VALUES
(
@a,
@b,
@c
)
WHERE NOT EXISTS
(
SELECT 0 FROM table WHERE a = @a, b = @b, c = @c
)
于 2013-06-26T18:44:15.237 回答
1
接受的答案有语法错误,并且与 MySQL 等关系数据库不兼容。
具体来说,以下内容与大多数数据库不兼容:
values(...) where not exists
虽然以下是通用 SQL,并且与所有数据库兼容:
select ... where not exists
鉴于此,如果您想在检查表是否已经存在后将一条记录插入到表中,您可以在语句中执行一个简单select
的 withwhere not exists
子句insert
,如下所示:
INSERT
INTO table_name (
primay_col,
col_1,
col_2
)
SELECT 1234,
'val_1',
'val_2'
WHERE NOT EXISTS (
SELECT 1
FROM table_name
WHERE primary_col=1234
);
只需使用select
关键字传递所有值,并将主键或唯一键条件放在where
子句中。
于 2021-09-13T23:17:11.173 回答
0
使用 WHERE NOT EXISTS 的答案的问题是:
- 性能——逐行处理可能需要大量的表扫描
table
- NULL 处理——对于可能存在 NULL 的每一列,您必须以更复杂的方式编写匹配条件,例如
(a = @a OR (a IS NULL AND @a IS NULL))
. 重复 10 列和中提琴 - 你讨厌 SQL :)
更好的答案是考虑到关系数据库提供的强大的 SET 处理能力(简而言之——如果可以避免的话,永远不要在 SQL 中使用逐行处理。如果不能——再想一想,无论如何都要避免它)。
所以对于答案:
- 将(所有)数据加载到临时表(或可以在加载前安全截断的临时表)中
- 以“set”方式运行插入:
INSERT INTO table (<columns>)
select <columns> from #temptab
EXCEPT
select <columns> from table
请记住,EXCEPT 可以安全地处理每种列的 NULL ;) 以及根据可用索引和表统计信息选择高性能连接类型进行匹配(散列、循环、合并连接)。
于 2021-09-15T00:49:09.923 回答