首页 > 解决方案 > Mysql 仅在之前插入行时更新

问题描述

如果行存在(并且已插入),我只想运行更新查询。我尝试了几种不同的方法,但这可能是我如何循环的问题。插入工作正常并创建记录和更新应该采用现有值并每次添加它(10 存在 + 15 添加,25 存在 + 15 添加,40 存在......我在循环中尝试了这个但它运行了列表中的每个项目,每次都是一个巨大的数字。每次单击链接时页面都会运行,因此用户退出并返回

while($store = $SQL->fetch_array($res_sh)) 
{
$pm_row = $SQL->query("SELECT * FROM `wishlist` WHERE shopping_id='".$store['id']."'");
$myprice = $store['shprice'];
    $sql1 =  "insert into posted (uid,price) Select '$uid','$myprice'
        FROM posted WHERE NOT EXISTS (select * from `posted` WHERE `uid` = '$namearray[id]') LIMIT 1";
    $query = mysqli_query($connection,$sql1);  
}

$sql2 = "UPDATE posted SET `price` = price + '$myprice', WHERE shopping_id='".$_GET['id']."'"; 
$query = mysqli_query($connection,$sql2);

标签: phpmysqlloops

解决方案


利用mysqli_affected_rows插入查询,验证它是否成功插入,您可以为更新查询创建条件。

但是,如果您在插入后立即运行更新,则会导致人们相信它可以同时完成。在这种情况下,在没有上下文的情况下,您可以$myprice在插入之前乘以 2 - 您可以查看是否可以避免这样做。

此外,但稍微复杂一些,您可以为此使用SQL 事务,并确保您准确地引用了您想要更新的行。如果插入失败,您的更新将不会发生。

当然,如果您为更新完美地引用了插入的行,那么无论如何更新都不会发生。例如,在这些行上有一个主自增键,mysqli_insert_id用于获取最后插入的 ID,并使用该 ID 更新行。但是这种方法可能会在大容量系统或随机竞争事件中中断,这会导致我们直接回到单个查询或事务利用率。


推荐阅读