用于重复更新或使用CASE插入的MariaDB语法

问题描述 投票:0回答:1

我有一个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

对不起,格式化不好。

mysql mariadb unique-constraint on-duplicate-key
1个回答
0
投票
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时,print <> VALUES(print)不再为TRUE,并且lastUpdated也不会更新。
© www.soinside.com 2019 - 2024. All rights reserved.