簡體   English   中英

是否可以在mysql中插入一個用條件計算的值?

[英]Is it possible to insert into mysql a value that's calculated with a condition?

我有一些使用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,我會收到以下錯誤:“ERROR 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)

作為一般答案,使用on duplicate update應略微提高插入性能,因為它可以節省數據庫與您選擇的代碼之間的往返。 它也是一個原子操作,類似於使用查詢的方法,因此當你有兩個查詢的線程/程序時,它解決了潛在的錯誤,每個線程/程序都決定沒有給定時間戳的記錄,並且都試圖插入它。

關於pct ,正確答案可能不是將它作為表中的字段。 相反,您可以在查詢時計算它。 in_bytes0情況可以通過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

如果你絕對必須將它作為一個字段,那么同樣的case表達式當然可以應用於on duplicate key子句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM