【问题标题】:What's a fast query to delete duplicate primary keys instead of updating them (keeping the latest record)?什么是删除重复主键而不是更新它们(保持最新记录)的快速查询?
【发布时间】:2015-04-13 15:41:28
【问题描述】:

我正在使用 Pentaho Data Integration 将大型 JSON 数据转换为 MySQL 数据库。

不管怎样,当然有纯表插入的选项,也可以是表插入/更新(它会查找一个key进行更新,如果没有找到就插入行)。

这些数据基本上是工单的当前表示/状态——所以我需要根据唯一工单 ID 更新给定行的所有数据列。

对于 Pentaho,可能还有大多数应用程序,更新比插入慢得多。特别是因为,至少在这个应用程序中,您最多可以有 25 个连接同时写入(插入)数据,但只有 (1) 进程执行查找-然后-写入。

因此,我宁愿执行以下操作:插入所有数据(一天左右一次).. 然后立即运行一个删除所有重复票证 ID 的查询——除了最大的票证 ID(又名latest) "更新时间。"

我觉得这样会快得多——我想知道如何在 MySQL 中实现这一点。我觉得有点像

从其中ticket_id = ticket_id 和update_time

【问题讨论】:

  • 在 MySQL 中你不能有重复的主键。因此,如果插入带有现有的主键,MySQL 将自动拒绝。
  • 啊,我可能说错了。我只是使用票证 ID 作为唯一标识符。我不认为我实际上将它设置为主键。
  • 唯一标识符也不允许重复。你真正拥有什么? (将 CREATE TABLE 语句粘贴到您的问题中。)
  • 好吧,它不是唯一标识符,只是表格反映了每张工单的当前状态。每个 Ticket_Id 应该有一行。我没有正式或技术上对 Ticket_ID 字段做任何特别的事情——它只是,从语义上讲,应该是唯一的。在实践中,暂时不会,因为我觉得使用 25 个连接来写入数据,然后删除旧的重复项,比更新唯一键更快。我只是想弄清楚如何做到这一点。
  • 你不能让 TICKETID 唯一字段或作为主字段,以便 MySQL 在插入自身时拒绝重复的行。?你试过吗?

标签: mysql duplicates primary-key insert-update


【解决方案1】:

我觉得我在另一个页面上找到了这个方法:

DELETE FROM ztable zt
WHERE EXISTS (
SELECT *
FROM ztable ex
WHERE ex.CaseKey = zt.CaseKey
AND ex.recordDate > zt.recordDate
);

【讨论】:

    猜你喜欢
    • 2021-11-16
    • 2020-12-19
    • 2011-08-31
    • 2019-12-20
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多