2009-10-22 279 views
0

我有表,我将记录插入到另一个表。 标记记录插入的最佳方式是什么,所以它不会被尝试再次插入?标记记录插入

+2

示例代码表示赞赏;) – Ossi 2009-10-22 14:03:16

回答

2

你可以看到像这样的两个表之间的差异:从tableFoo

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

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

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

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

+0

我还没有共同的列,我可以尝试添加一个,如何结合2列kkep它独特(其中一个将是时间戳)这将是可能的吗? – Ossi 2009-10-22 14:21:50

+0

这两个表都应该有唯一的列,如ID。您可以加入该专栏。 – 2009-10-22 14:23:11

+0

如果您不明白,请随时提出更多问题:]并感谢接受! – 2009-10-22 14:29:34

1

插入只记录不是在你的其他表,或者使用一个NOT EXISTS条款或通过左侧的接合部和从结果

1

最好的办法是使用公共密钥过滤所有not-NULL记录(或有关键第一个表格是第二个表格键的主要部分)。这样,您只需从表1中选择不存在的行即可。

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

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

+0

你是什么意思“第一个表的关键是第二个表的关键的主要部分”? – Ossi 2009-10-22 14:23:21

0

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

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

2.)如果你的表格没有被标准化,并且没有很好的密钥,你可以添加一个ProcessedDate到table1。插入具有空ProcessDate的所有记录,然后将ProcessDate设置为当前日期时间。在插入table2的过程中,您只需确保没有新记录插入到table1中。

不知道你的表格结构很难给出一个很好的答案。