【问题标题】:MySQL function to insert record if update fails?如果更新失败,MySQL函数插入记录?
【发布时间】:2009-01-22 16:04:15
【问题描述】:

我目前正在处理的部分系统涉及登录 mysql,计数经常更新。

插入的数据格式为:

   date    | name | count |
-----------+------+-------+
2009-01-12 | alan |   5   |
2009-01-12 | dave |   2   |
2009-01-12 | mary |   1   |

这些数据定期从一个平面文件中解析出来,如上所述,为数据库插入/更新做准备 - 数据库上的唯一键是 (date, name) 对。

以前,此系统会在决定更新或插入之前检查现有表中是否存在给定 datename 对的任何记录。

我们遇到的问题是,随着该表的增长,响应时间并没有得到任何改善,我们希望尽可能减少查询次数。

系统最近更新为运行INSERT ... ON DUPLICATE KEY UPDATE 查询,这略微减少了selects 的数量,但我们的常见情况是update

我想知道是否有人知道一个 mysql 函数,它本质上是反向的 INSERT ... ON DUPLICATE KEY UPDATE,即会尝试更新一行,如果没有匹配则执行插入?


编辑

上面我没有说的太清楚,例如当我有记录('2009-01-12','alan','5')时我想做的是:

UPDATE table SET count = count+5 WHERE date = '2009-01-12' and name = 'alan';

如果上述失败,则插入上述数据。增加计数器的需要是REPLACE 不起作用的原因。 Replace 执行删除和插入操作,并且不允许您引用被删除的行,因此 count = count + 5 不会将之前的 count 值增加 5。

@jasoncohen - INSERT ... ON DUPLICATE KEY UPDATE 确实可以完成这项工作,但我想问是否有更优化的方法来做到这一点。

对于因原始措辞不佳造成的任何混乱,我们深表歉意!

【问题讨论】:

    标签: optimization mysql


    【解决方案1】:

    就是这样。使用“UPDATE ... ON NO KEY INSERT”,数据库引擎仍然必须首先检查是否有要更新的内容。因此,即使更新是最常见的,也不需要单独的构造

    【讨论】:

    • 说得有道理,希望比期望有一些神奇的,性能超强的 mysql 查询来解决这个问题!
    • 一个使用示例会很好。
    • @HelgaIliashenko 要求在否决之前先询问一个使用示例会很好
    • 我决定投反对票,系统要求我对此发表评论,我已经完成了。现在我不能放弃我的反对票。对此感到抱歉。
    • @HelgaIliashenko 看不到您要查找的示例。特别是问题是关于是否出于性能原因需要替代语法,并且假设的 UPDATE ON NO KEY 不会对性能产生影响。你在找什么例子?
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      我一直在试图弄清楚你到底想要什么,而在我看来,如果数据匹配,你不想做任何事情?我没有看到解决方案,如果“计数”会以某种方式发生变化并需要更新,那么您将被 INSERT INTO ON DUPLICATE KEY UPDATE 卡住(我并没有真正看到问题所在)。

      但是,如果计数永远不会更新,您可能需要查看 INSERT IGNORE INTO 如果唯一键(日期 + 名称)已经存在,它将忽略插入。

      您没有考虑“刷新/旋转”您的平面文件,因此只检查添加的材料?还是不可能?

      编辑:

      由于重复键违规,INSERT 将立即失败,并在这种情况下触发 UPDATE。根本不应该是任何性能问题。我一直在相当大的数据库上这样做,我没有注意到从空数据库开始与已经填充的数据库相比有任何巨大的性能差异。

      但是,不时运行 ANALYZE TABLE/OPTIMIZE TABLE 以保持索引处于良好状态可能是件好事。

      【讨论】:

        【解决方案4】:

        为什么INSERT 不够用?即使大多数时候它是一个重复的键,因此是一个更新(而不是相反),它仍然是正确的操作,对吧?

        您只是询问性能问题吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-25
          • 1970-01-01
          • 1970-01-01
          • 2020-08-18
          相关资源
          最近更新 更多