2011-01-31 61 views
1

我有2个具有相同结构和自动递增ID的表,我试图将行从一个复制到另一个。使用自动增量ID在identiacal表之间复制行

当我尝试从表A复制一行到表B,并且唯一标识与表B中已存在的唯一标识冲突时,我想简单地将我要复制的行的标识设置为下一个值是自动增量计数器。

虽然这对我来说已经很难了。下面是我有:

"INSERT INTO tableB SELECT * FROM tableA WHERE tableA.id = '$id'ON DUPLICATE KEY UPDATE tableB.id = LAST_INSERT_ID(tableB.id)" 

似乎并不是虽然要为我工作。另一件事是我需要确保如果密钥发生了变化,我需要能够告诉新密钥是什么,以便我可以对我正在复制的相关表中的行进行必要的更改。

任何人都可以指出我做错了什么?

我意识到这里有一些类似的问题,我已经阅读了所有这些,但我仍然无法理解这一点。

编辑背景信息:由于有人问我为什么我的设置是这样(我不会感到惊讶,如果它是次优)。基本上,我通过一堆字符串匹配将另一个网站上的一些内容转移到数据库中。但是,对于拼凑过程的挑剔性质,我不喜欢对最近刮掉的数据运行实时查询。所以基本上我按照计划安排,每隔一段时间检查一次数据的完整性,如果看起来没问题,我将它复制到运行查询的“实时”表中。

回答

1

好吧根据您的更新,我会简单地使用一个表。

添加一个字段“已检查”默认值0 - 而不是复制你已经决定的数据是合适的,只需将检查的字段更新为2.如果它不可用,则更新为1。

定期删除这些记录与检查= 1

更妙的是更新到1时,其确定并删除那些不是立即。

+0

当我设计数据库时(这是我第一次使用关系数据库),我想到了这种方法,我认为当我在数据库中有成千上万条记录时,它不值得额外列的开销数据库。我猜如果它只是一个布尔列,那么额外的开销就相当微不足道了。 – 2011-02-01 12:30:17

1

用途:

ON DUPLICATE KEY UPDATE tableB.id = tableB.id 

那么这应该返回记录的ID作为最后一个插入ID - 即使它没有被“插”,并保持你的引用完整性尖顶部...

现在 - 你想要做的事似乎对我有点困惑(请随时进一步解释 - 它可能会给你一个更好的答案)。

为什么您需要将所有记录从a复制到b?这些表是否意味着'相同'?

+0

我不知道这似乎并没有为我工作。现在我在tableA中有一堆NULL行只是为了测试。当我尝试复制具有重复键的行时,tableB中没有任何更改。另一方面,tableB中没有对应行的复制行得通。我会编辑我的OP,并提供一些评论,说明为什么我的设置是自从你提到它之后的方式。 – 2011-01-31 11:48:31