我们用MySQL构建了一个应用程序作为数据库。我们每周都会从数据库中导出数据转储,并删除所有数据。现在我们想要将所有这些转储合并在一起,以进行一些数据分析任务。
我们面临的问题是所有表的“id”字段都是自动递增,因此它在所有数据转储中以1开头,这会导致表中出现重复的ID。我确信必须有更好的方法来实现它,因为它应该是MySQL管理中非常常见的任务。
最好的方法是什么?
答案 0 :(得分:3)
如果您可以轻松识别外键字段(例如它们采用* _id形式),那么您可以使用您选择的脚本语言通过添加“id空间偏移”来修改转储文件中的主键和外键。
例如,假设您有两个转储文件,并且您知道它们的主键范围不超过1,000,000,您将第二个转储文件中的主键和外键增加1,000,000。
实现起来并不是一件容易的事,因为您必须检测语句中外键字段的位置,然后修改语句中其他位置的相同列位置的值。
如果您的外键不易通过通用命名约定识别,那么您必须在每个表中保留有关如何根据列位置查找其位置的单独信息。
祝你好运。答案 1 :(得分:0)
最好的方法是,您有另一个数据库作为数据仓库,您可以将应用程序数据库的内容复制到该数据仓库中。之后,您不会截断所有表,只需使用DELETE FROM tablename - 这样,您的auto_increments就不会被重置。
导出某些内容然后截断数据库是一个丑陋的解决方案,然后期望导入将正常进行。即使您解决了自动增量冲突的问题(如果唯一键约束失败,还有ON DUPLICATE KEY语句允许您执行某些操作),则不保证表(外键)之间的关系将被保留。
这是一个广泛的主题,给出的解决方案快速且不好,其他人可能会建议其他方法,但如果您这样做是为了卸载您的应用程序使用的数据库 - 这是一个糟糕的设计。如果您的目标是通过更大的数据集获得更好的性能,请尝试谷歌MySQL的分区支持。
答案 2 :(得分:0)
对于您已经转储的数据,将其加载到不使用ID列作为主键的表中。您不必定义任何主键。您将拥有多个具有相同ID的行,但这不会妨碍您的数据分析。
展望未来,您可以设置一个规则来转储,然后删除超过一天的行。这样你的ID就会不断增加。
或者,您可以将此数据复制到使用ARCHIVE存储引擎的表中。这有利于保留分析数据,因为它会压缩其内容。