回答

收藏

有条件的ON DUPLICATE KEY UPDATE(仅在某些条件为真时更新)

技术问答 技术问答 241 人阅读 | 0 人回复 | 2023-09-14

我正在使用以下查询:
2 T) b0 M: E9 n1 M0 q+ p, hINSERT INTO userlist (username, lastupdate, programruncount, ip)
2 z0 _7 W5 _" x/ mVALUES (:username, NOW(), 1, :ip)
8 a7 H% `& |: ?; [5 [+ S7 F1 ION DUPLICATE KEY UPDATE8 i( }  y. t6 A* X9 ^5 ~
lastupdate = NOW(), programruncount = programruncount + 1, ip = :ip;4 |# i/ Z3 L9 B; E4 E8 b
但是,我也想将其作为ON DUPLICATE KEY UPDATE条件,因此它将执行以下操作:0 p- P, J( M9 K! U( s
如果 lastupdate不到20分钟前(lastupdate > NOW() - INTERVAL 20 MINUTE)。
+ F# Z) }, k2 b* [0 l正确: 更新lastupdate = NOW(),添加一个programruncount,然后更新ip = :ip。. W! [2 c9 ^5 v
False: 所有字段均应保持相同。# O- |' R* [/ u

- U% w: f" |2 A3 s我不太确定该怎么做,但是环顾四周之后,我尝试IF在ON DUPLICATE KEY UPDATE零件中使用“声明” 。5 K% E& p" P( f
INSERT INTO userlist (username, lastupdate, programruncount, ip)4 H" n" y: w5 k' x" e( C
VALUES ("testuser", NOW(), "1", "127.0.0.1")' h6 R9 n9 f9 f- E! q8 D' ^! b
ON DUPLICATE KEY UPDATE" ]; H2 N7 P" T6 m# d
IF(lastupdate > NOW() - INTERVAL 20 MINUTE, VALUES(lastupdate, programruncount + 1),# t1 A7 Z9 [" [8 Q, U( h
lastupdate, programruncount);
/ Q- {8 h3 K: [9 [# A但是我收到以下错误: #1064 - You have an error in your SQL syntax; check the manual
. K: a* B$ W9 W6 Pthat corresponds to your MySQL server version for the right syntax to use near
( K) r# Q3 S. m0 f- z; d. `+ v'IF(lastupdate > NOW() - INTERVAL 20 MINUTE, VALUES(lastupdate,  n6 H; o, Z6 h+ u/ V
programruncount +' at line 6
. I% L, F* V" {$ b4 k               
' P6 k1 S' ~, f解决方案:9 H+ K! \7 W4 |
                & j% Q9 _+ b# R

! {$ i1 Q8 o4 `1 O6 u$ i7 I/ J$ L- j* n5 I. g  F$ d; r4 p
                您使用的IF语句不正确4 Q5 o! \% r! x! L% }6 P# R
INSERT INTO userlist (username, lastupdate, programruncount, ip)2 o) p# Z! s$ n; T9 J% F6 k  ?
VALUES (:username, NOW(), 1, :ip)) L5 l$ ]7 W* w( G; G
ON DUPLICATE KEY UPDATE
" A; X5 c+ l0 V* C' I; P% a. \lastupdate = IF(lastupdate > NOW() - INTERVAL 20 MINUTE, NOW(), lastupdate),
  b8 `3 ~: C* p  lprogramruncount = IF(lastupdate > NOW() - INTERVAL 20 MINUTE, programruncount + 1,   programruncount),
, C0 d# O1 ]: v* A  e# h" {ip = IF(lastupdate > NOW() - INTERVAL 20 MINUTE, :ip, ip);
( A6 t/ P. K" T1 J3 F# K* `; g) A, v因此,IF检查条件并返回作为其参数提供的两个值之一。参见MySQL的流控制运算符。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则