Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在mysql中插入一个';是用条件计算的吗? 我有一些使用MySQL连接器的C++代码。我们的数据库是innodb_Mysql_Sql_Database_Select - Fatal编程技术网

是否可以在mysql中插入一个';是用条件计算的吗? 我有一些使用MySQL连接器的C++代码。我们的数据库是innodb

是否可以在mysql中插入一个';是用条件计算的吗? 我有一些使用MySQL连接器的C++代码。我们的数据库是innodb,mysql,sql,database,select,Mysql,Sql,Database,Select,代码的目标是定位一行,如果它存在,则使用新值更新它,如果它不存在,则执行插入 目前,它正在执行一个显式的操作:“选择…where…”,然后根据是否找到记录进行插入或更新 我最近发现了“在重复密钥更新时插入…”这句话,我很高兴在这里应用它,我想我们可以用它来提高性能 首先,我是否正确地假设性能可能会提高 第二,我有点问题。插入的一个字段是将同一记录的两个其他字段分开的结果。我需要解释除以0的情况 我正在尝试这样做: "INSERT INTO table (time_stamp, in_bytes,

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

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

我最近发现了“在重复密钥更新时插入…”这句话,我很高兴在这里应用它,我想我们可以用它来提高性能

首先,我是否正确地假设性能可能会提高

第二,我有点问题。插入的一个字段是将同一记录的两个其他字段分开的结果。我需要解释除以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_字节为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)