通过选择插入时,如何在插入表之前检查重复项
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 之前检查表中是不是存在名称 [重复]