0

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

4

4 回答 4

2

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

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

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

这样做的原因是,即使其中一个表具有空值,左连接也会返回记录,这与内连接不同,它的作用相反。

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

于 2009-10-22T14:10:45.080 回答
1

仅插入不在其他表中的记录,使用NOT EXISTS子句或左连接并过滤not-NULL结果中的所有记录

于 2009-10-22T14:04:52.057 回答
1

最好的方法是使用一个公共键(或者让第一个表的键成为第二个表键的前导部分)。这样,您只需从表 2 中不存在的 TABLE1 中选择行。

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

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

于 2009-10-22T14:10:36.723 回答
0

我经常使用两种方法。根据表格的性质,一种方法可能比另一种更好,但是如果您使用#2,则可能有机会使您的表格结构更好。

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

2.) 如果您的表未规范化并且没有好的键,您可以将 ProcessedDate 添加到 table1。插入所有具有空 ProcessDate 的记录,然后将 ProcessDate 设置为当前日期时间。您只需确保在插入 table2 期间没有新记录插入 table1。

在不了解您的表结构的情况下,很难给出一个好的答案。

于 2009-10-22T14:15:40.817 回答