mysql - 是否可以将根据条件计算的值插入到 mysql 中?

标签 mysql sql database select

我有一些使用 MySQL 连接器的 C++ 代码。我们的数据库是 innodb。

代码的目标是定位一行,如果它存在则用新值更新它,如果它不存在则插入。

目前,它正在执行一个显式操作:“选择...其中...”,然后根据是否找到记录进行插入或更新。

我最近发现了“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)

关于mysql - 是否可以将根据条件计算的值插入到 mysql 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31433921/

相关文章:

执行alter语句后MYSQL自动增量重置(mysql 5.0.92)

php - 如何检查模型的任何字段是否为空或为空?

sql - 当表有自增主键时,如何跳过MySQL中的所有列名?

database - 异构数据库系统在实践中吗?

mysql - 如何在mysql中运行嵌套左连接

mysql - SELECT 将检查超过 MAX_JOIN_SIZE 行

php - 在触发器中使用定界符的 Mysql 错误

mysql - 如果否则查询 SQL

mysql - 如何在一次查询中获取特定记录的总和和所有记录的总和?

database - Delphi - 在运行时将字段更改为计算字段。这是一个好习惯吗?