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# 的母版页中工作,并且在不使用母版页的情况下工作正常
为啥 setState() 在我的情况下不能在 React 中工作?