2011-04-15 69 views
0

我们用MySQL作为数据库构建了一个应用程序。每周我们从数据库中导出数据转储,并删除所有数据。现在我们要将所有这些转储合并在一起进行一些数据分析任务。合并2个MySQL数据转储的最佳方式是什么?

我们所面临的问题是,所有的表的“ID”字段是自动递增,因此它与1中的所有数据转储,这会导致重复的ID在该表开始。我相信必须有更好的方法来完成它,因为它应该是MySQL管理中的一个非常常见的任务。

什么是最好的方式去呢?

回答

2

如果你可以轻松地识别你的外键的字段(如他们采取的形式* _id),那么你可以使用你选择的脚本语言中加入一个“id空间偏移修改转储文件的主键和外键”。

例如假设你有两个转储文件,你知道它们的主键值范围不超过100万,你1,000,000递增第二个转储文件中的主键和外键。

这并不完全是微不足道的实施,你将在同一列的位置在声明中其他地方检测中陈述外键字段的位置,然后修改值。

如果你的外键都没有被命名规范,很容易识别,那么你必须保持有关如何基于列的位置,找到自己的位置每桌单独的信息。

祝你好运。

0

最好的方法是,您有另一个数据库充当数据仓库,将数据库的内容复制到其中。之后,您不会截断所有表格,只需使用DELETE FROM tablename - 这样,您的auto_increments将不会重置。

这是一个丑陋的解决方案,有导出的东西,然后截断数据库,然后期望导入将正常进行。即使遇到自动增量冲突的问题(如果唯一键约束失败,那么就有ON DUPLICATE KEY语句允许您执行某些操作),但不保证表(外键)之间的关系将被保留。

这是一个广泛的话题,并给出解决方案是快速,不好听,其他一些人很可能会建议其他的方法,但如果你这样做是为了卸载应用程序使用的数据库 - 这是一个糟糕的设计。尝试谷歌MySQL的分区支持,如果你的目标是更好的数据集的性能。

0

对于已经转储的数据,请将其加载到不使用ID列作为主键的表中。您不必定义任何主键。您将拥有多个具有相同ID的行,但这不会妨碍您的数据分析。继续前进,您可以设置一个规程,在该规则中转储并删除比一天前更多的行。这样你的ID就会不断增加。

或者,您可以将此数据复制到使用ARCHIVE存储引擎的表中。这对保留用于分析的数据很有用,因为它压缩了其内容。

相关问题