PDO 在条件不工作的情况下插入到重复键中

Posted

技术标签:

【中文标题】PDO 在条件不工作的情况下插入到重复键中【英文标题】:PDO Inert Into On Duplicate Key with condition not working 【发布时间】:2018-11-10 19:42:21 【问题描述】:

一切正常,除了如果数据库分数

try 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $conn->prepare('INSERT INTO UserTable (fb_id, level, score, star, timestamp) ' .
    'VALUES(:fb_id, :level, :score, :star, :timestamp)' .
    'ON DUPLICATE KEY UPDATE score= :score, timestamp= :timestamp WHERE score < :score');
    //WHERE score < $score
    $stmt->bindParam(':fb_id', $fb_id);
    $stmt->bindParam(':level', $level);
    $stmt->bindParam(':score', $score);
    $stmt->bindParam(':star', $star);
    $stmt->bindParam(':timestamp', $current_time);
    $stmt->execute();
    echo "New record created successfully";

catch(PDOException $e)
      
        echo $sql . "<br>" . $e->getMessage();
      

【问题讨论】:

使用IF 作为值。 插入不支持 where 子句 【参考方案1】:

这是你想要的吗?

INSERT INTO UserTable (fb_id, level, score, star, timestamp) ' .
     VALUES(:fb_id, :level, :score, :star, :timestamp)' .
     ON DUPLICATE KEY UPDATE
         score = GREATEST(:score, score),
         timestamp = (CASE WHEN :score > score THEN :timestamp ELSE timestamp END);

【讨论】:

【参考方案2】:

我认为这应该可行。现有值和新值中较大的一个用于更新。在MAX()函数中,score指的是现有值,VALUES(score)指的是新值。

$stmt = $conn->prepare('INSERT INTO UserTable (fb_id, level, score, star, timestamp) ' .
'VALUES(:fb_id, :level, :score, :star, :timestamp)' .
'ON DUPLICATE KEY UPDATE score = GREATEST(score, VALUES(score)), timestamp= :timestamp');

【讨论】:

谢谢迈克。语法看起来正确,但我的 sql 版本 mysql Ver 14.14 Distrib 5.7.24 可能有一些问题 我收到此错误 - SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'VALUES(score))、timestamp='1541781260'' 附近使用正确的语法 对不起,MAX() 是一个聚合函数,GREATEST() 是我应该放的。答案已更新。

以上是关于PDO 在条件不工作的情况下插入到重复键中的主要内容,如果未能解决你的问题,请参考以下文章

如果找不到源图像,如何显示替代图像? (在 IE 中工作但在 Mozilla 中不工作的错误)[重复]

Jquery 不能在使用 ASP.NET C# 的母版页中工作,并且在不使用母版页的情况下工作正常

多个并且在mysql中工作或不工作[重复]

为啥 setState() 在我的情况下不能在 React 中工作?

pip install 在笔记本单元格中工作,但在脚本中不工作[重复]

正则表达式在文本编辑器(崇高)中工作,但在 python 中不工作 [重复]