我有一些使用MySQL连接器的C ++代码。我们的数据库是innodb。
代码的目标是找到一行,如果存在,则用新值对其进行更新,如果不存在,则进行插入。
当前,它正在执行一个明确的操作:“ select ... where ...”,然后根据是否找到记录进行插入或更新。
我最近发现了“ INSERT ... ON DUPLICATE KEY UPDATE”:https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html,很高兴在这里应用它,以为我们可以以此改善性能。
首先,我是否认为性能可能会提高?
其次,我有一个问题。插入的字段之一是将同一记录的其他两个字段相除的结果。我需要考虑除以0的情况。
我正在尝试做这样的事情:
"INSERT INTO table (time_stamp, in_bytes, out_bytes, pct) VALUES(date + "," + inBytes + "," + outBytes + ", out_bytes/in_bytes) ON DUPLICATE KEY UPDATE in_bytes = in_bytes + 0, out_bytes = out_bytes + 0, pct = out_bytes/in_bytes;"
不幸的是,如果in_bytes为0,则会出现以下错误:“错误1048(23000):列'pct'不能为空”。
对此可以采取任何措施吗?以某种方式提高了我们原始方法之外的性能?我曾考虑过要有一个用于计算pct字段的触发器,但这似乎可能无法提高性能。
您可以使用任何所需的表达式。在这种情况下,您可以使用IF(condition,value when true,value when false)
:
pct = IF(in_bytes != 0, out_bytes/in_bytes, 42)
或者,对于奖励积分,您可以使用COALESCE做同样的事情:
pct = COALESCE(out_bytes/in_bytes, 42)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句