在表之间复制行而不复制数据
将数据从一个表传输到另一个表时,防止插入重复行至关重要。为了实现这一目标,我们需要一种过滤掉现有记录的方法。
在您的初始方法中,您尝试使用带有子查询的 WHERE 子句来识别唯一行。但是,子查询缺乏确定重复项的条件。
使用子查询结合 WHERE 过滤的解决方案
要有效过滤掉重复项,您可以按如下方式修改子查询:
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.) )
此更新的子查询添加了一个条件,用于比较源表和目标表之间的特定字段以确定是否存在重复项
使用外连接的解决方案
或者,您可以使用外连接来获得相同的结果。外连接检索一个表中的所有行以及另一表中的匹配行,将不匹配的行保留为 NULL。
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
在这种情况下,外连接根据关键字段(Key1、Key2、 ETC。)。源表中与目标表中任何行都不匹配的行的关键字段将为 NULL 值,这些行将被插入到目标表中。
其他注意事项
如果您只关心防止源表中的重复项,则可以在 SELECT 中使用不同的关键字语句:
INSERT INTO destTable SELECT Distinct field1,field2,field3,... FROM srcTable
最后,出于性能原因,建议在 INSERT 语句中指定特定字段,而不是使用 SELECT *。
以上是如何在表之间复制行而不创建重复项?的详细内容。更多信息请关注PHP中文网其他相关文章!