当前位置: 首页 > 知识库问答 >
问题:

在mysql中使用java将大量记录从一个表移动到另一个表

赫连华皓
2023-03-14

我试图通过将不需要的记录移动到墓地表中,在数据库中进行一些垃圾收集。如果我有这四张桌子-

  1. 版本(id为主键)
  2. Version_history(version_id是外键)
  3. Version_graveyard(此处已丢弃版本行)
  4. Version_history_graveyard(此处为废弃版本历史记录行)

它包括以下步骤-

  • 获取要删除的所有版本ID
  • 通知所有人要删除的版本ID。(所以我需要在实际移动之前从版本表中获取行-这是一个非常复杂的select查询)
  • 将Select from original Version表格插入Version\U graveyard表格。(这基本上会重复我在上一步中执行的Select查询)
  • 再次将Select from original Version\U history表格插入Version\U graveyard\U history表格。(这将再次重复我已经使用的select查询)
  • 从原始表中删除数据(再次使用相同的select查询)

因此,正如您所看到的,这将需要重复多次选择查询。我想从第一个查询中获取所有版本,然后对所有后续查询使用NamedParameterJdbcTemboard批处理更新函数和In子句,例如-

Insert into Version_Graveyard Select * from Version where id in (?, ?, ..... ?);

Delete from Version Where id in (?, ?, .. ?)

但问题是要删除的版本数可能有数千个(第一次运行时约为20K),根据文档,IN子句中的值不能超过1000。

那么,还有什么其他方法可以避免对多个步骤重复相同的select查询呢。

共有2个答案

燕智
2023-03-14

您可以将多个IN子句与OR组合起来。

 SELECT * FROM VERSION WHERE ID IN (...) OR ID IN (...) OR ID IN (...)
时恩
2023-03-14

可以在VersionVersion_history表中添加一个特殊字段(标志),指示下次应将记录移动到墓地表。例如exportToGraveard

下一步是执行更新操作,而不是选择设置字段的操作。所有其他查询现在都可以访问应通过标志移动的所有记录。

对于性能优化,也可以在字段上添加INDEX。但是请注意使用INDEX,UPDATE语句应该更慢。

 类似资料:
  • 问题内容: 我想通过将记录从一张桌子移到另一张桌子来对学生进行归档。这是我尝试使用的代码: 我遇到的问题是我遇到错误: 致命错误:XX行/archive-student.php中的内存不足(已分配80478208)(试图分配80216043字节) 除了有一个名为archive的列并从0更改为1之外,是否有其他方法可以执行此操作?这是因为我有30-50页选择表的记录。:) 问题答案: 就那么简单。

  • 问题内容: 我不知道为什么我对此查询感到困惑。 我有两个表:带有记录和带有记录。两个表都需要包含相同的数据,但是存在一些不匹配的情况。 我需要编写一个mysql查询以插入从到的丢失记录。 最后,两者和应该相同。 我不想先截断所有条目,然后再从另一个表中插入。因此,请提供任何帮助。 谢谢你。 问题答案: 也可以使用它。这将避免像John Woo的回答那样避免子查询的开销(当系统可能为外部查询的 每条

  • 问题内容: 我有两个看起来像这样的表: 表:案例 id 名称 状态 case_no 表:注意事项 id case_id note_date 注释 我希望能够创建一个查询,以从案例表中获取数据,并仅从注释表中获取案例表中每一行的最新条目。到目前为止,我根本没有运气。 任何指针将不胜感激 问题答案: 这只会返回带有注释的案例: 如果需要所有案例,无论是否附带注释:

  • 问题内容: 我有两个具有相同结构的表。我需要从一个表中选择数据,然后将它们存储到另一个表中。 我怎样才能做到这一点? 问题答案: 因为它们是相同的结构,所以您可以做

  • 我一直在设计一个基于Swing的桌面RPG程序,以促进带有GUI控制元素的基于文本的角色扮演。 为了促进这一点,每个正在运行的客户端都会获得一个带有所有重要JFrames的主桌面(托管客户端上的“GM Desktop”和远程客户端上的“Player Desktop”)。此外,GM和Players都可以为角色打开“透视桌面”,为他们提供一个单独的JDesktopPane,其中包含提供该角色视角的“角

  • 问题内容: 我想从一个表中读取所有数据,然后将一些数据插入到另一个表中。我的查询是 但我有一个错误 请帮我。 问题答案: 您可以使用INSERT … SELECT语法。请注意,您可以在SELECT部分​​中直接引用“ 1”。