代码之家  ›  专栏  ›  技术社区  ›  Joel

MySQL:更新所有行,将字段设置为0,但将一行字段设置为1

  •  11
  • Joel  · 技术社区  · 16 年前

    是否有有效的方法将所选行的字段更新为0,但根据ID将其中一行设置为1。

    基本上,我在一个数据库中有多个对象,我想在哪一个对象“inuse”之间切换,所以查询将其中一行(按id)设置为inuse=1,另一行设置为inuse=0。

    谢谢)

    7 回复  |  直到 16 年前
        1
  •  22
  •   chaos    16 年前
    UPDATE `table`
    SET `inuse` = (`id` = 23)
    
        2
  •  11
  •   Artem Russakovskii    16 年前

    当然

    UPDATE table SET inuse=IF(id=ABCD, 1, 0)
    

    如果id为abcd,则将inuse字段设置为1,否则设置为0。

        3
  •  1
  •   Quassnoi    16 年前
    UPDATE  table
    SET     inuse = (id = @id)
    WHERE   id = @id
            OR inuse
    

    这将只更新相关行。

        4
  •  0
  •   TheTXI    16 年前
    UPDATE myTable
    SET Field = 0
    WHERE FieldID <> [WhateverID]
    
    UPDATE myTable 
    SET Field = 1
    WHERE FieldId = [WhateverID]
    
        5
  •  0
  •   serbaut    16 年前

    尝试

    update tbl set inuse = if(test, 1, 0);
    

    或更短

    update tbl set inuse = test;
    

    例如

    update tbl set inuse = name = 'foo';
    
        6
  •  0
  •   Sunny Milenov    16 年前

    如果您在设置标志之后,所以代码的任何其他部分都不会同时使用相同的对象,那么调用代码设置inuse=1并在完成后重置它会更好。否则,您将结束一个线程,将一个对象(行)标记为正在使用,然后如果另一个线程需要另一个对象,它将在第一个线程仍在使用时重置它。

    如果不是这样,并且您只希望能够为一个设置inuse,并重置所有其他设置,则可以使用:

    UPDATE myTable
    SET InUse = CASE
       WHEN myTable.id = @id THEN 1
       ELSE 0
    END
    
        7
  •  0
  •   longneck    16 年前

    如果您的数据库使用事务,这是最好的方法:

    update myTable set inuse = 0;
    update myTable set inuse = 1 where id = ?;
    

    如果您不使用事务,那么另一个使用案例的答案是最好的选择,因为它是可移植的。但它需要比两个update语句更多的CPU时间。

    推荐文章