通过选择插入时,如何在插入表之前检查重复项

Posted

技术标签:

【中文标题】通过选择插入时,如何在插入表之前检查重复项【英文标题】:How can I check for duplicates before inserting into a table when inserting by select 【发布时间】:2011-04-08 19:25:41 【问题描述】:

通过选择插入时如何在插入表之前检查重复项:

insert into table1
select col1, col2 
from table2

我需要检查 table1 是否已经有 table1.col1.value = table2.col1.value 的行,如果是,则从插入中排除该行。

【问题讨论】:

table1和table2是什么关系?您将如何加入他们? 【参考方案1】:
INSERT INTO table1 
SELECT t2.col1, 
       t2.col2 
FROM   table2 t2 
       LEFT JOIN table1 t1 
         ON t2.col1 = t1.col1 
            AND t2.col2 = t1.col2 
WHERE  t1.col1 IS NULL 

使用 except

INSERT INTO @table2 
SELECT col1, 
       col2 
FROM   table1 
EXCEPT 
SELECT t1.col1, 
       t1.col2 
FROM   table1 t1 
       INNER JOIN table2 t2 
         ON t1.col1 = t2.col1 
            AND t1.col2 = t2.col2 

使用不存在的替代方法

INSERT INTO table2 
SELECT col1,col2 
FROM table1 t1
WHERE
NOT EXISTS( SELECT 1
    FROM table2 t2
    WHERE t1.col1 = t2.col1
          AND t1.col2 = t2.col2)

【讨论】:

那么为什么我要检查 t1.col1 是否为空? @Prabhu - LEFT JOIN...IS NULL 是检查现有值并仅在不存在的地方插入的常用方法。 NULL 表示col1 中没有具有该值的现有行。【参考方案2】:
insert into table1
select col1, col2 
from table2 
where table2.col1 not in (select col1 from table1)

【讨论】:

如果您只关心 col1 在 table1 中不存在,您可以将其添加到您的 where 子句中。 这可能是最简单的答案,但我会使用外连接 如果我想同时检查 col1 和 col2,我该如何修改呢?我需要检查两次吗? 有几种方法可以做到这一点...根据数据库上的列类型和索引,它们可能效率不高... 1) 创建表 2 中项目的临时结果集已经在表 1 中,然后将剩余的(不存在的)插入到表 1 中; 2)如果 col1 和 2 是字符类型,您可以将它们连接起来,然后使用连接后的值作为查找... 要详细讨论为什么这是错误的(以及到目前为止发布的所有其他答案),请参阅***.com/questions/2522379/…。让原子 UPSERT 工作比这要复杂得多。【参考方案3】:
insert into table1
select distinct col1, col2 
from table2 

【讨论】:

这仅在 table1 没有任何数据开始时才有效。【参考方案4】:

您可以简单地将 IGNORE 添加到您的插入语句中。

例如

INSERT IGNORE INTO table1
SELECT col1, col2 
FROM table2

这是在讨论here

【讨论】:

以上是关于通过选择插入时,如何在插入表之前检查重复项的主要内容,如果未能解决你的问题,请参考以下文章

如何在插入 MySQL 之前检查表中是不是存在名称 [重复]

在插入之前检查 sqlite 中的重复项(核心数据)

如何检查未插入表中的重复值?

如何检查html表是不是在js中重复行并对输入求和而不是插入另一行?

将对象插入核心数据实体时处理重复项

Vim:如何在可视块模式下插入?