【问题标题】:How to UPSERT using where clause如何使用 where 子句进行 UPSERT
【发布时间】:2015-03-13 21:29:30
【问题描述】:

我上网寻找并回答这个问题,但我找不到答案。

我想在更新或插入之前检查四列。我不能使用 INSERT...ON DUPLICATE KEY UPDATE 因为它不允许 where 子句。所以我尝试使用我创建的以下语句。

"SELECT COUNT(id) INTO @count FROM room_prices WHERE (hotel_di = $hotel_id AND room_id = $room_id AND period_id = $periodId AND meal_plan_id = $mealPlanId) "
                . "IF @count > 0 THEN "
                . "UPDATE room_prices SET price = $price WHERE (hotel_di = $hotel_id AND room_id = $room_id AND period_id = $periodId AND meal_plan_id = $mealPlanId) "
                . "ELSE "
                . "INSERT INTO room_prices (hotel_id, room_id, period_id, meal_plan_id, price) VALUES ($hotel_id, $room_id, $periodId, $mealPlanId, $price) "
                . "END IF"

但这一个也不起作用。它给出了这个错误。

您提交的查询无效。

有没有办法做到这一点?

【问题讨论】:

    标签: mysql sql sql-update insert-update


    【解决方案1】:

    hotel_idroom_idperiod_idmeal_plan_id 上的唯一索引开始:

    CREATE UNIQUE INDEX idx_room_prices_4 on room_prices(hotel_id, room_id, period_id, meal_plan_id)
    

    那么你可以使用on duplicate key update:

    INSERT INTO room_prices(hotel_id, room_id, period_id, meal_plan_id, price) 
        SELECT $hotel_id, $room_id, $periodId, $mealPlanId, $price
        ON DUPLICATE KEY UPDATE price = $price;
    

    【讨论】:

    • 好的,我会尝试..在此之前我要求确保它。它会在更新价格列之前检查所有的hotel_id、room_id、period_id、meal_plan_id 列吗?
    • @Yasitha 。 . .是的,如果您在这四列上有唯一索引。
    • 在我的情况下,hotel_id、room_id、meal_plan_id 不是此表中的唯一字段。所以这对我不起作用。
    • @Yasitha 。 . .您的代码的逻辑是防止表中的重复。这使我认为您确实希望防止表中出现重复。
    猜你喜欢
    • 2018-05-26
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    相关资源
    最近更新 更多