我有一个5列的表格。
id | uId | print | sessionId | lastUpdated
当我启动id时,它是主键,并设置为自动递增。一旦它没有按预期工作,我将print和sessionId作为UNIQUE索引。继续,我最终删除了自动增量(我希望保留在id列上),并仅在print和sessionId上保留唯一索引
我想插入一个新行,其中包含print,sessionId及其最后一次更新的时间。我的查询开始为:
INSERT INTO prints
(print,sessionId,lastUpdated)
VALUES (:print,:sid,:lastC)
ON DUPLICATE KEY UPDATE
print=:print,
sessionId = :sId,
lastUpdated = :lastV
这一直有效,直到我开始一个新会话,然后由于完整性约束而导致失败,因为sessionId是重复的...
SQLSTATE [23000]:违反完整性约束:1062复制项'n0Uv3bnoc,lYFOhEpdCePtrjumoQTxRVfblJRwnhuBTnBhNNYTu1TiBnl9zGq4Kr'作为键'sessionId'的]
我认为这与UPDATE print=:print, sessionId = :sId, lastUpdated = :lastV
部分有关,首先设置打印,导致它在更改sessionId和lastUpdated之前出错。
但是我不知道。我试图使用CASE,因为这似乎是一个更好的主意,但我无法弄清楚使我的语句正常工作的正确语法。
我的目标是,如果打印或sessionId不存在,则插入新行;如果sessionId已经存在,则更新打印。
我尝试过的其他查询包括
INSERT INTO prints
(print,sessionId,lastUpdated)
VALUES (:print,:sid,:lastC)
ON DUPLICATE KEY UPDATE
print = CASE print WHEN <> THEN VALUES(:print), ELSE print END,
sessionId = CASE sessionId WHEN <> VALUES(:sid) THEN VALUES(:sid) ELSE sessionId END,
lastUpdated=now()
INSERT INTO prints
(print, sessionId, lastUpdated)
VALUES (:print,:sid,:lastC)
CASE WHEN print <> VALUES(:print) THEN
VALUES(:print)
ELSE print END,
last_update = CASE WHEN print <> VALUES(:print) THEN
:lastV
ELSE lastUpdated END;
如果不存在print / sessionId,但是要同时更新打印和会话(如果存在则不输入新行,则要同时更新打印和会话,什么是插入新记录的正确查询?
并且我是否需要更改我的表布局,我想将id用作自动增量的主要对象,但目前不是。
我应该走“ case”路线,还是在重复的UPDATE上继续执行INSERT?
当前表包含:
Full texts
id
uId
print
sessionId
lastUpdated
0
NULL
58f7bacf1c5bacb9f28ed19a93c9f6aa
9WAwmDgi6zNKBcx1b1jJE9wNrDHR47cX40B6pRhkgDEi8kT1lk...
1572371228.6665
0
NULL
835e63e7e5f817043b7603e1ee515c40
-A23Oe2O668zVNRMS3QvJISZUm6R3AkLt7Bj2T3g3u8rf1PFP8...
1572371207.542
对不起,格式化不好。
INSERT INTO prints (print, sessionId, lastUpdated)
VALUES (:print, :sid, :lastC)
ON DUPLICATE KEY UPDATE
lastUpdated = CASE WHEN print <> VALUES(print)
THEN VALUES(lastUpdated)
ELSE lastUpdated
END,
print = CASE WHEN print <> VALUES(print)
THEN VALUES(print)
ELSE print
END
请参见db-fiddle上的演示
注意,您必须首先更新lastUpdated
列。首次更新print <> VALUES(print)
不再为TRUE,并且lastUpdated
也不会更新。