【问题标题】:Run an INSERT ON DUPLICATE KEY UPDATE using php and mysql使用 php 和 mysql 运行 INSERT ON DUPLICATE KEY UPDATE
【发布时间】:2020-07-15 18:19:14
【问题描述】:

我正在尝试在PHPMySQL 中使用INSERT ON DUPLICATE KEY UPDATE 查询。

我有一个用户个人资料,用户可以在其中将图像更新到他们的个人资料(然后将其保存到数据库中)。我的问题是,如果在profileImage 表中他们已经有一个条目(并且可以使用studentID 识别用户,那么只需更改文件路径(其中包含图像的名称),并且不要在 db 表中插入另一行。

但是,我的查询仍然允许用户上传超过 1 张图片时遇到问题。

php 脚本:

$stmt = $conn->prepare ("INSERT INTO `profileImage` (`imageID`, `imagePath`, `studentID`) VALUES (NULL, ?, ?) ON DUPLICATE KEY UPDATE `imageID` = VALUES (`imageID`), `imagePath` = VALUES (`imagePath`), `studentID` = VALUES (`studentID`) ");
$stmt->bind_param("si", $fileName, $studentID); 
$stmt->execute() or die("Failed to insert image into the database");

db中的profileImage表:

imageID 是主键,studentID 是外键,反正我可以在我的语句中将studentID 设置为触发器,所以如果studentID 已经存在于此表中,那么运行更新而不是插入?

【问题讨论】:

  • 那么 imageID 不是唯一的吗?如果没有,并且您只希望每个学生 1 张图片,那么您需要一个唯一的 studentid 键。
  • @P.Salmon imageID 是主键,因此对于表中的每一行都是唯一的。
  • 你真的有 3 个参数(id 必须设置),并且在更新子句中你不应该再设置 id
  • @splash58 我明白了,那么在 INSERT 查询中应该只是 NULL 吗?由于主键 imageID 设置为自动增量。
  • @P.Salmon 使用插入查询,我必须设置为 NULL 否?因为我不知道将分配什么 id,因为该列只是设置为自动递增。我应该将其设置为其他内容吗?

标签: php mysql prepared-statement on-duplicate-key


【解决方案1】:

1)

您似乎需要确保studentID 列的值是唯一的。因为这两件事是最好的;将其设置为唯一并允许 NULL 值(这可能不是必需的,但这取决于您使用数据的方式)。

所以,from this SO Question 你可以这样做:

ALTER TABLE `profileImage` ADD UNIQUE (`studentID`)

在您的 SQL 中。

2a)

完成此操作后,您需要调整原始 SQL Dupe 检查,P.Salmon 的 as started in comments,您永远不需要设置或更新主键列。

 INSERT INTO `profileImage` (`imagePath`, `studentID`) VALUES ( ?, ?) 
 ON DUPLICATE KEY UPDATE `imagePath` = VALUES (`imagePath`), `studentID` = VALUES (`studentID`)

2b)

除此之外,您也不需要设置 studentID 列,如果它已经存在,并且(假设是)重复的原因;所以:

 INSERT INTO `profileImage` ( `imagePath`, `studentID`) 
 VALUES ( ?, ?) ON DUPLICATE KEY UPDATE `imagePath` = VALUES (`imagePath`)

【讨论】:

  • 太棒了,谢谢!!我没有事先将 studentID 设置为唯一标识符 - 非常感谢您在上面指出这些项目。很好的解释! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 2023-02-06
  • 2010-10-07
  • 1970-01-01
  • 2017-04-14
  • 2013-10-03
相关资源
最近更新 更多