是否可以在mysql中插入一个';是用条件计算的吗? 我有一些使用MySQL连接器的C++代码。我们的数据库是innodb
代码的目标是定位一行,如果它存在,则使用新值更新它,如果它不存在,则执行插入 目前,它正在执行一个显式的操作:“选择…where…”,然后根据是否找到记录进行插入或更新 我最近发现了“在重复密钥更新时插入…”这句话,我很高兴在这里应用它,我想我们可以用它来提高性能 首先,我是否正确地假设性能可能会提高 第二,我有点问题。插入的一个字段是将同一记录的两个其他字段分开的结果。我需要解释除以0的情况 我正在尝试这样做:是否可以在mysql中插入一个';是用条件计算的吗? 我有一些使用MySQL连接器的C++代码。我们的数据库是innodb,mysql,sql,database,select,Mysql,Sql,Database,Select,代码的目标是定位一行,如果它存在,则使用新值更新它,如果它不存在,则执行插入 目前,它正在执行一个显式的操作:“选择…where…”,然后根据是否找到记录进行插入或更新 我最近发现了“在重复密钥更新时插入…”这句话,我很高兴在这里应用它,我想我们可以用它来提高性能 首先,我是否正确地假设性能可能会提高 第二,我有点问题。插入的一个字段是将同一记录的两个其他字段分开的结果。我需要解释除以0的情况 我正在尝试这样做: "INSERT INTO table (time_stamp, in_bytes,
"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_字节为0,我会得到以下错误:“错误1048(23000):列'pct'不能为null”
对此有什么办法吗?在某种程度上提高了我们原始方法之外的性能?我曾考虑过使用触发器来计算pct字段,但这似乎不会提高性能。作为一般回答,在重复更新时使用
应该会略微提高插入性能,因为这样可以节省数据库和您通过选择代码得到的代码之间的往返。它也是一种原子操作,类似于使用查询的方法,因此它解决了当您有两个线程/程序进行查询时可能出现的错误,每个线程/程序都确定没有具有给定时间戳的记录,并且都试图插入它
关于pct
,正确的答案可能是根本不将其作为表中的字段。相反,您可以在查询时计算它。以字节为单位的为0
的情况可以用case
表达式解决:
SELECT time_stamp, in_bytes, out_bytes
CASE in_bytes WHEN 0 THEN -1 -- Or some other meaningful default
ELSE out_bytes/in_bytes
END AS pct
FROM my_table
如果您绝对必须将其作为字段,那么相同的大小写表达式当然可以应用于on duplicate key
子句。您可以使用任何您想要的表达式。在这种情况下,您可以使用IF(条件、值为true时、值为false时)
:
或者,对于奖励积分,您也可以使用:
对不起,我意识到我应该把这个发到db.stackexchange.Cool!我在网上找,但没找到。案例陈述也很好。非常感谢。关于不将其包含在表中,您可能是对的,尽管我没有设计模式,所以不确定是否可以更改它。
pct = IF(in_bytes != 0, out_bytes/in_bytes, 42)
pct = COALESCE(out_bytes/in_bytes, 42)