2009-06-18 3 views
11

행 선택 필드를 0으로 업데이트하는 효율적인 방법이 있지만 ID에 따라이 행 중 하나를 1로 설정하는 것이 효율적입니다.MySQL : 필드를 0으로 설정하고 하나의 행 필드를 1로 설정하는 모든 행 업데이트

기본적으로 데이터베이스에 여러 개의 개체가 있고 어느 것이 "inuse"인지 토글하고 싶기 때문에 쿼리가 행 (id 별) 중 하나를 inuse = 1로 설정하고 나머지는 inuse = 0. ID가 ABCD이고, 그렇지 않으면 0 경우

감사합니다 :)

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

답변

22
UPDATE `table` 
SET `inuse` = (`id` = 23) 
+1

너무 우아합니다. –

+0

Artem보다 빠르고 효율적입니다. – Joel

+0

정확히 같지 않을지라도 꽤 많이 같다고 생각합니다. –

11

물론이 사용중 필드에 1을 설정합니다.

0
UPDATE myTable 
SET Field = 0 
WHERE FieldID <> [WhateverID] 

UPDATE myTable 
SET Field = 1 
WHERE FieldId = [WhateverID] 
0

예를

update tbl set inuse = name = 'foo'; 
1
UPDATE table 
SET  inuse = (id = @id) 
WHERE id = @id 
     OR inuse 
에 대한

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

이하

update tbl set inuse = test; 

시도

관련 행만 업데이트합니다.

0

플래그를 설정 한 후 코드의 다른 부분이 같은 오브젝트를 동시에 사용하지 않으므로 호출 코드가 inuse = 1로 설정하고 완료되면 다시 설정하는 것이 좋습니다. 그렇지 않으면 하나의 스레드가 객체 (행)를 사용하지 않는 것으로 표시하게되고, 다른 스레드가 다른 객체를 필요로하면 여전히 사용 중일 때 첫 번째 스레드를 재설정합니다.

그렇지 않은, 당신은 단지 하나의 사용중 설정하고, 모든 다른 사람을 재설정 할 수 원한다면, 당신은 사용할 수 있습니다

UPDATE myTable 
SET InUse = CASE 
    WHEN myTable.id = @id THEN 1 
    ELSE 0 
END 
0

를 데이터베이스 트랜잭션을 사용하는 경우,이 최선의 방법입니다 그것을 할 : 그것은 휴대용 이후

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

당신이 트랜잭션을 사용하지 않는 경우, 다음 CASE를 사용하여 다른 대답은 최선의 방법입니다. 두 개의 UPDATE 문보다 많은 CPU 시간이 필요할 것입니다.

관련 문제