在单个查询中两次更新相同的mysql字段

时间:2014-07-12 07:02:26

标签: mysql sql

我不确定它是否可能,只是想知道它是否可行。我的列plan_popular的默认值为0。让我有一个列表:

Plan Name | plan_popular  |  amount
===================================
plan A           0           25.00
plan B           1           50.00
plan C           0           90.00

这就是我的表现:

$stmt = "update {CI}plans set plan_popular = 0";
$this->db->query($stmt);

$stmt2 = "update {CI}plans set plan_popular = 1 where plan_id = ?";
$this->db->query( $stmt2, array($plan_id) );

现在我已经设定了C计划。现在我想重置它,并希望将流行计划C设置为1.我正在做的是运行两个查询,一个我重置并使plan_popular 0,第二个是将计划C更新为1有id。单个查询是否可能?

3 个答案:

答案 0 :(得分:1)

您可以使用表达式来确定要分配的值:

UPDATE {CI}plans
SET plan_popular = IF(plan_id = ?, 1, 0);

答案 1 :(得分:1)

试试这个,

UPDATE {CI}plans
   SET `plan_popular` = CASE `Plan Name` 
                      WHEN 'plan C' THEN 1 
                      ELSE 0
                      END
 WHERE `Plan Name` IN((select `Plan Name` from {CI}plans where plan_popular=1 ) , 'plan C');

答案 2 :(得分:0)

更新可能很昂贵,操作锁定,触发器和约束触发等等。通常,您希望避免将字段更新为已有的相同值。在英语中,如果plan_id = variable且plan_popular为0,则将其设置为1,但如果plan_id为任何其他值且plan_popular为1,则将其设置为0.

UPDATE {CI}Plans
    SET plan_popular = if( plan_id = ?, 1, 0 )
where (plan_id = ? and plan_popular = 0)
   or (plan_id <> ? and plan_popular = 1);

where子句只允许通过更新实际更改的那些行。如果这是一个较大的表,那可能会对响应时间产生很大影响。逻辑比在数据库中执行的任何实际操作便宜得多。