在DUPLICATE KEY UPDATE半工作

时间:2014-08-10 12:50:55

标签: mysql sql mysqli where on-duplicate-key

我有一个名为cart的数据库表的购物车,用于存储每个SaaS实例购物车中的商品记录。我想要做的是,如果产品被添加到用户的购物车并且已经存在相同的记录,则只有当status =时才更新表中的数量列等于旧值加上新值。 0,否则,输入新记录。

故障:

如果项目已在购物车中,请更新数量列以仅在状态栏= 0时设置新数量值,否则,将项目作为新行添加到购物车表格。

这是我到目前为止所拥有的:

    $itemList = $db->query("INSERT INTO 

                                        cart(
                                        `lmsid`, 
                                        `userid`, 
                                        `courseid`, 
                                        `assigned_by`, 
                                        `assigned_on`, 
                                        `quantity`) 

                            VALUES(

                                        :lmsid, 
                                        :userid, 
                                        :courseid, 
                                        :assigned_by, 
                                        :assigned_on, 
                                        1) 

                            ON DUPLICATE KEY UPDATE 

                                        `quantity` = `quantity` + values('quantity')
                            )", 

                            array(
                            "lmsid"=>$core['id'], 
                            "userid"=>$user,
                            "courseid"=>$_POST['courseid'], 
                            "assigned_by"=>$userInfo['id'], 
                            "assigned_on"=>time())
    );

目前......

  1. 如果记录根本不存在,则会完美插入。
  2. 如果存在status = 0的记录,则现有数量将完美更新。
  3. 如果存在status = 2的记录,则查询将失败:
  4. Unhandled Exception. SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '66-2' for key 'useridAndCourseid'

    表格中的键useridAndCourseid是:

    UNIQUE KEY `useridAndCourseid` (`userid`,`courseid`)
    

    当从购物车中删除产品时,状态列会更新为“1”,此记录会永久保留在我们的记录中。当产品再次支付我们的记录时,状态将更新为“2”。当记录刚好等待处理时,它的状态为0。

    我需要帮助

    目前查询工作一半,但我只是不知道怎么说'如果记录存在且状态= 0更新数量,否则,插入新记录'。这实际上是我想要实现的所有目标,但我认为我试图让它复杂化,或者我花了这么长时间试图过度复杂化我忘记了我追求的东西!我确信有一个简单的解决方案。如果我只能使用ON DUPLICATE KEY和WHERE子句......

    感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

有多种方法可以解决这个问题。但是,如果您想要insert的单个语句,则需要创建一个可以执行所需操作的唯一索引。此索引应该有一个列,在0和其他时间status = 0时会显示某个值(例如NULL)。 NULL值不被视为重复键。您可以将其称为IsActiveFlag

如果您有这样的列,那么索引:

create index idx_cart(userid, courseid, IsActiveFlag)

应该允许你做你想做的事。