代码之家  ›  专栏  ›  技术社区  ›  ConroyP

MySQL函数在更新失败时插入记录?

  •  8
  • ConroyP  · 技术社区  · 17 年前

    我目前正在开发的系统的一部分涉及mysql中的日志,计数会经常更新。

    插入的数据格式为:

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

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

    以前,该系统会检查现有表中给定的任何记录 date name 在决定更新或插入之前进行配对。

    我们遇到的问题是,随着这个表的增长,响应时间并没有变得更好,我们希望尽可能减少查询的数量。

    该系统最近更新为运行 INSERT ... ON DUPLICATE KEY UPDATE 查询,这减少了 select 虽然有点小,但我们常见的情况是 update .

    我想知道是否有人知道mysql函数,它本质上是 插入。..重复密钥更新 相反,即将尝试更新一行,如果没有匹配,则执行插入?


    编辑

    我上面没有说得太清楚,有记录后我想做什么 ('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 -the 插入。..重复密钥更新 确实可以完成这项工作,但我想知道是否有更好的方法来做到这一点。

    很抱歉由于糟糕的原始措辞而造成的任何混淆!

    4 回复  |  直到 8 年前
        1
  •  3
  •   Michael Buen    17 年前

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

        2
  •  2
  •   Héctor Vergara    17 年前
        3
  •  1
  •   jishi    17 年前

    我一直在试图弄清楚你到底想要什么,在我看来,如果数据匹配,你什么都不想做?我看不到解决方案,如果“计数”会以某种方式发生变化并需要更新,那么你就只能使用INSERT INTO ON DUPLICATE KEY UPDATE(我真的没有看到这个问题)。

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

    你没有考虑过“冲洗/旋转”你的平面文件,只检查添加的材料吗?难道这不可能吗?

    编辑:

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

    然而,为了保持索引的良好状态,不时运行ANALYZE TABLE/OPTIMIZE TABLE可能是一件好事。

        4
  •  0
  •   Jason Cohen    17 年前

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

    你只是在问性能问题吗?