0

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?

4

3 回答 3

1

尝试,INSERT WHERE NOT EXISTS其中和是相关列,和是相关值。abc@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 的答案的问题是:

  1. 性能——逐行处理可能需要大量的表扫描table
  2. NULL 处理——对于可能存在 NULL 的每一列,您必须以更复杂的方式编写匹配条件,例如 (a = @a OR (a IS NULL AND @a IS NULL)). 重复 10 列和中提琴 - 你讨厌 SQL :)

更好的答案是考虑到关系数据库提供的强大的 SET 处理能力(简而言之——如果可以避免的话,永远不要在 SQL 中使用逐行处理。如果不能——再想一想,无论如何都要避免它)。

所以对于答案:

  1. 将(所有)数据加载到临时表(或可以在加载前安全截断的临时表)中
  2. 以“set”方式运行插入:
INSERT INTO table (<columns>)
    select <columns> from #temptab
    EXCEPT
    select <columns> from table

请记住,EXCEPT 可以安全地处理每种列的 NULL ;) 以及根据可用索引和表统计信息选择高性能连接类型进行匹配(散列、循环、合并连接)。

于 2021-09-15T00:49:09.923 回答