1

请没有 MySQL 的答案!

基本查询如下(假设A为Key)

INSERT INTO destination (A,B,C)
SELECT a1,b1,c1 
FROM source
WHERE (selectconditions) ; 

源包含许多可能已经或可能不在目标中的记录,这意味着一旦遇到重复记录,插入就会失败。

期望的行为:插入或忽略

这是给定问题的理想方案。如果可以插入,否则继续。

伪c#/java:

foreach(record in selectQuery) 
{  
   try { destination.insert(record) } 
   catch(insertionException){//squelch} 
}

这可以通过添加在 SQL 中处理

AND NOT EXISTS (SELECT A FROM destination INNER JOIN source on destination.A = source.a1) 

到查询的末尾——换句话说,在插入之前检查。

处理这种常见情况还有哪些其他选择?这些技术的优缺点是什么?

4

4 回答 4

2

一些数据库为涉及条件插入/更新/忽略的操作提供了明确的语法。

例如, OracleSQLServer具有 MERGE 语句,它可以基于一组谓词插入/更新/删除/忽略记录。

忽略特定于数据库的语法,您可以使用排除已存在记录的谓词执行插入:

INSERT INTO target( A, B, C )
SELECT SA, SB, SB FROM source
WHERE NOT EXISTS (select A, B, C from TARGET where A = SA, B = SB, C = SC)
于 2009-07-20T21:11:30.583 回答
1

如果您共享一个公共主键:

INSERT INTO destination 
( A, B, C)
SELECT a1, b1, c1 FROM source
WHERE source.pk not in ( SELECT pk FROM destination );

如果您不这样做:

INSERT INTO destination 
( A, B, C)
SELECT a1, b1, c1 FROM source
WHERE a1 + b1 + c1 not in ( SELECT a+b+c FROM destination );
于 2009-07-20T20:56:17.883 回答
0

我可能会做以下事情:

INSERT INTO Target (A, B, C)
SELECT
     S.A, S.B, S.C
FROM
     Source S
LEFT OUTER JOIN Target T ON
     T.A = S.A AND
     T.B = S.B AND
     T.C = S.C
WHERE
     T.A IS NULL
于 2009-07-20T22:38:17.693 回答
0

UNIQUE如果您使用 MySQL 并且可以使用索引强制非重复键,则可以使用INSERT ON DUPLICATE KEY UPDATE幂等(无操作)更新来处理重复项。

INSERT INTO Target (A, B, C) (SELECT a1, b1, c1 FROM Source) ON DUPLICATE KEY UPDATE A=A;

这样做的好处是速度非常快并且不需要额外的SELECT.

于 2009-07-20T23:03:06.600 回答