我有表,我将记录插入另一个表。 标记插入记录的最佳方法是什么,因此不会尝试再次插入?

有帮助吗?

解决方案

您可以看到两个表之间的区别如下:

  

SELECT * FROM tableFoo
    LEFT JOIN tableBar ON tableFoo.commonColumn = tableBar.commonColumn
    WHERE tableBar.commonColumn IS NULL

这个想法是两个表都有一个匹配的列,当列为空时连接的记录是仅存在于tableBar中的记录。

这样做的原因是因为左连接将返回记录,即使其中一个表具有空值,与内连接不同,后者则相反。

获得这些记录后,您可以根据返回的ID插入。

其他提示

只使用 NOT EXISTS 子句或者从结果中加入并过滤所有 not-NULL 记录,只插入不在其他表中的记录

最好的方法是使用公共密钥(或将第一个表的密钥作为第二个表密钥的前导部分)。这样,您只需从TABLE1中选择表2中的NOT EXISTS行。

如果您需要以某种方式转换密钥,最好的替代方法是在TABLE1上使用插入触发器:当您在那里插入行时,触发器将触发,您可以将数据插入TABLE2。这具有使用单个事务的好处 - 也有缺点。保留数据一致性是一个好处,如果TABLE2用于报告或其他非必要目的,这是一个缺点。

不要决定在TABLE1中使用表示已插入行的标志。这在逻辑和物理设计上都是丑陋的,因为您将表中的数据耦合到使用该表的进程。

我经常使用两种方法。根据桌子的性质,一种方式可能比另一种方式更好,但是如果你选择#2,则有可能使你的桌面结构更好。

1。)确保您的表已编入索引并具有良好的主键。从table1中选择table2中不存在主键的所有记录。这适用于规范化表

2。)如果你的表没有规范化并且没有好的密钥,你可以向table1添加一个ProcessedDate。插入具有null ProcessDate的所有记录,然后将ProcessDate设置为当前日期时间。您必须确保在插入table2期间没有新记录插入到table1中。

在不知道你的桌面结构的情况下,很难给出一个好的答案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top