2016-12-12 4 views
0

찾은 모든 관련 질문을 살펴 보았지만 광산에 대한 답을 얻을 수 없었습니다. Mysql 한 쿼리에서 여러 행의 한 열을 업데이트하십시오.

는이 같은 테이블을 가지고 :

"ID가"기본 키입니다
id | name | age | active | ...... | ... | 

, 그리고 ... (30) 열 같은 것이있다 의미한다. "활성"열은 tinyint 유형입니다.

내 작업 :

업데이트 식별자 1,4,12,55,111 단일 쿼리에 = 활성 1 (사람들은 단지 예이다, 그것은 총 1,000 다른 ID 일 수있다).

은 내가 그랬어 :

UPDATE table SET active = 1 WHERE id IN (1,4,12,55,111) 
  • 의 트랜잭션 내, 내가이 과정에서 뭔가를 업데이트하고있어 원인.

  • 엔진은 InnoDB의

입니다

내 문제 :

사람이 (가)로 번역합니다 IN의 원인, 이러한 쿼리를 수행하는 실행에서 5 개 쿼리에 해당 말해 줬어 주어진 수의 OR을 찾아서 하나씩 실행하십시오.

결국 1 대신에 IN의 숫자 N을 얻습니다.

그는 임시 테이블을 만들고, 새 값을 모두 삽입 한 다음 조인을 통해 업데이트 할 것을 제안합니다.

맞습니까? 동등성과 성능 모두.


무엇을 제안합니까? 난 삽입을 생각 했어 .. 중복 된 데 도움이 될 것입니다하지만 행에 대한 모든 데이터를 가지고, 그것만 이드, 그리고 내가 그것에 활성화 = 1을 설정하고 싶습니다.

아마도이 쿼리가 더 좋을까요?

UPDATE table SET 
active = CASE 
WHEN id='1' THEN '1' 
WHEN id='4' THEN '1' 
WHEN id='12' THEN '1' 
WHEN id='55' THEN '1' 
WHEN id='111' THEN '1' 
ELSE active END 
WHERE campaign_id > 0; //otherwise it throws an error about updating without where clause in safe mode, and i don't know if i could toggle safe mode off. 

감사합니다.

+0

예 또는 맞음 존재 함. 업데이트 테이블 세트 활성 = 1 어디 존재 (table2에서 1을 선택 ...) –

답변

0

기본 키를 사용하기 때문에 아래와 같이 생각합니다.

UPDATE table SET active = 1 WHERE id<=5 
+0

1-5 그냥 예입니다, ID는 숫자의 집합이 될 수 있습니다 : 예 : (1,10,23,44,51), 질문을 수정하여 명확하게 나타낼 것입니다. – user2212726

1

그 반대의 경우입니다. OR은 때때로 IN으로 바뀔 수 있습니다. IN은 특히 열에 색인이있는 경우 효율적으로 실행됩니다. IN에 1000 개의 항목이있는 경우 id을 기반으로 1000 개의 프로브를 테이블에 적용합니다.

충분히 새로운 버전의 MySQL을 실행하고 있다면이 변환을 보려면 EXPLAIN EXTENDED UPDATE ...OR...; SHOW WARNINGS;을 수행 할 수 있다고 생각합니다.

UPDATE CASE...은 아마도 각 행을 지루하게 검사 할 것입니다.

UPDATE을 여러개의 UPDATEs (100-1000 행)으로 나눈 경우 시스템의 다른 사용자가 더 좋을 것입니다. More on chunking.

어디서 ID를 얻었습니까? SELECT을 거친 경우 UPDATE과 결합하여 2 단계가 아닌 1 단계로 만들 수 있습니다.