将行复制到表中同时避免重复
目标是将所有行从一个表 (srcTable) 传输到另一个表 (destTable) ,排除任何重复的条目。虽然添加带有过滤掉重复项的子查询的 WHERE 子句似乎很简单,但这种方法可能会失败。
子查询问题:
原始查询如下:
INSERT INTO destTable SELECT * FROM srcTable WHERE NOT EXISTS(SELECT * FROM destTable)
但是,此查询不会插入任何行,因为子查询返回 destTable 中的所有行,无论是否它们匹配 srcTable 中的任何行。要使子查询正常工作,它必须包含一个附加条件来根据相关字段识别重复行。
修订后的子查询:
INSERT INTO destTable SELECT Field1, Field2, Field3, ... FROM srcTable WHERE NOT EXISTS(SELECT * FROM destTable WHERE (srcTable.Field1 = DestTable.Field1 AND srcTable.Field2 = DestTable.Field2 ... etc.))
此修订后的子查询比较特定的子查询用于确定重复项并将其从插入中排除的字段。
外部联接替代方法:
另一种方法是使用外连接:
INSERT INTO destTable SELECT s.field1, s.field2, s.field3,... FROM srcTable s LEFT JOIN destTable d ON (d.Key1 = s.Key1 AND d.Key2 = s.Key2 AND...) WHERE d.Key1 IS NULL
此外连接技术从 srcTable 中过滤掉在 destTable 中具有匹配键的行,并在插入期间排除重复项.
寻址源表重复项:
如果担心 sourceTable 包含重复行,则应修改查询以选择不同的行:
INSERT INTO destTable SELECT DISTINCT Field1, Field2, Field3,... FROM srcTable
建议在 INSERT 语句中包含特定字段名称优于使用 SELECT *.
以上是如何将行从一个表复制到另一个表,同时防止重复?的详细内容。更多信息请关注PHP中文网其他相关文章!