2011-05-12 79 views
1

我有多个最终用户mySQL数据库,其数据量相当大,必须与由外部数据源填充的数据库(也是mySQL)同步。最终用户可以将数据添加到他们的“本地”数据库,但不会添加到数据源。合并自动增量表数据

问题是如何合并/同步两个数据库,包括数据库表之间的外键,而不会覆盖“本地”添加项或更改本地添加项的键。

事情我已经考虑包括使用饲料DB的CSV转储和做与IGNORE一个LOAD DATA INFILE,然后就比较文件,查看从饲料行没有被写入,并手工编写和写作一些脚本逐行通过馈送数据库并在本地数据库中创建新行,同时创建新的密钥。但是,这似乎可能会非常缓慢,特别是对于多个dbs。

对此有何看法?如果有一种合并这些数据库的方法,以一种简单和快速的方式保存密钥,这将是理想的。

+0

这是饲料数据库和用户数据库之间的双向更新吗?或者只是从Feed数据库更新用户的数据库? – 2011-05-12 23:41:09

+0

只是从Feed中更新用户的dbs。 – julio 2011-05-13 03:27:56

回答

1

一种选择是使用GUID而不是整数键,但做出如此重大的改变可能不切实际。

假设你只是从中央“feed”数据库更新用户数据库,我会使用CSV和LOAD INFILE,但加载到目标数据库中的临时表中。然后,您可以用新值替换这些键,最后将行插入永久表中。

如果您不处理大量数据,它可能很简单,只需找到现有数据的最高ID和传入数据的最低ID之间的差异即可。将此数量添加到传入数据中的所有密钥,并且不应有冲突。这会浪费一些PK值,但这可能不值得担心,除非你的记录数量在数百万。这假定你的PK是整数和顺序的。

+0

感谢Jon,我同意GUID是要走的路,但在这种情况下意味着应用程序的重新编写。 – julio 2011-05-13 15:22:56

3

使用复合主键。

主键(id,SOURCE_ID)

使每个DB使用不同的值SOURCE_ID。这样你可以复制数据库内容而不会发生PK冲突。

+0

@ N.B .--你能解释一下更多关于这是如何工作的?此时,我将source_id作为源中的ID进行跟踪 - 因此源中的源ID和用户数据库中的源ID将匹配,尽管用户数据库和数据源数据库中的“主键”ID不匹配。 – julio 2011-05-13 03:50:35