2011-08-23 1 views
2

왜이 같은 테이블 :mysql, '중복 키 업데이트'저장소에 삽입하는 방법 prev. 가치?

create table tbl (
    id int not null auto_increment, 
    key1 int not null, 
    key2 int not null, 
    value0 double, 
    value1 double, 
    key(id), 
    unique(key1,key2) 
); 

다음 쿼리는 이전 저장되지 않습니다. 기존 레코드를 업데이트 할 때 'value0'의 값을 'value1'로 변경 하시겠습니까? 전혀 가능합니까?

insert into tbl (key1, key2, value0, value1) 
values (...), (...) 
, ... 
, (...) 
on duplicate key update value0=values(value0), value1=if(value0<>values(value0),value0, value1); 
+0

달성하려는 목표는 무엇입니까? 이전의 가치는 무엇을 의미합니까? 어쩌면 당신은 삽입, 삽입하지 ... 중복 키 업데이트에 필요 한가? –

+0

미안, create table statement에 키를 기술하는 것을 잊어 버렸습니다. 지금은 더 명확한가요? – d0rc

+0

어쩌면 당신은 단지 업데이트 문장을 전환 할 필요가 있습니다 : 중복 키 업데이트 value1 = if (value0 <> values ​​(value0), value0, value1), value0 = values ​​(value0); –

답변

4

UPDATE는 값을 순차적으로 (UPDATE 및 DUPLICATE UPDATE 문에서) 업데이트합니다. 즉, 동일한 명령문에서 업데이트 된 update 문의 값을 참조하면 원래 값이 아닌 업데이트 된 값을 얻게됩니다.

on duplicate key update value0=values(value0), value1=if(value0<>values(value0),value0, value1); 

value0 항상 값 (value0)에 equeals 명령문이 때문에

는 - 그것은 업데이트 문의 이전 부분에 업데이트했다. 명령문의 위치를 ​​바꿔야한다고 예상대로 작동하게하려면 다음을 수행하십시오.

on duplicate key update value1=if(value0<>values(value0),value0, value1), value0=values(value0);