【问题标题】:Differentiate between failed UPDATE due to false conditions and failed UPDATE due to unchanged values区分由于错误条件导致的失败 UPDATE 和由于值未更改而导致的失败 UPDATE
【发布时间】:2018-02-08 13:43:42
【问题描述】:

我的问题是关于 MySQL UPDATE 语句,如果不满足 WHERE 子句中的更新条件,它返回 zero'0',但如果 UPDATE 语句中规定的值也是,则返回 zero'0'没有改变,我正在使用mysqli_affected_rows($conn); 检查受影响的行是否有办法区分这两种故障。

这是一个示例表:

ID(auto_increment) | music_name     | price | genre |
556785             | rock star      | $30   | rap   |
896785             | game of thrones| $30   | O.S.T |
116785             | i can dance    | $30   | dance |

这是一个示例代码:

$query="UPDATE `songs` SET `music_name`='$name', `price`='$price' WHERE `genre`=$genre" ;
$result= mysqli_query($conn,$query);

if(mysqli_affected_rows($conn)===0)
{
  $query="INSERT INTO `songs` (`music_name`,`price`,`genre`) VALUES ('$name','$price','$genre')";
  $result=mysqli_query($conn,$query);
}

现在这工作正常,但是当输入数据库表中已经存在的相同值时 mysqli_affected_rows();将通过导致 INSERT INTO 语句运行而返回 zero '0' ,我们最终会得到重复的行。

我怎样才能使这样的查询更好?无需在 UPDATE 之前添加更多查询来选择和检查行。另一种选择可能是使用带条件的触发器来删除重复的行?但我认为有更好的方法。

目前除了auto_increment上的ID之外,表中没有唯一列

【问题讨论】:

  • music_name 列是否唯一?
  • 实际问题是什么,您事先不知道是否必须插入新记录或更新现有记录?那你应该去看看INSERT ... ON DUPLICATE KEY UPDATE
  • 不,在我的情况下没有唯一列,如果有唯一列,则插入语句将不会运行,我无需担心
  • 除了 ID 列是 auto_increment。

标签: php mysql


【解决方案1】:

首先,如果值相同,MySQL 将不会更新该行,因此受影响的行数将为 0。

此问题的解决方案:

$query="SELECT count(*) as cnt FROM `songs` WHERE `music_name`='$name', `price`='$price' AND `genre`=$genre" ;
/****get count from the query******/
if(count > 0 ) {
//update the table row
}
else{
//insert the table row
}

【讨论】:

  • 是的,这会起作用,但如果没有其他解决方案,我会尝试减少我必须运行的查询数量,然后我会接受你的回答。
  • 找到了更合适的解决方案并更新了您的答案,感谢您为我指明了正确的方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多