2011-08-15 5 views
0

우분투 12.10 및 MySQL Workbench에서 MySQL 5.1.41을 사용하고 있습니다.MySQL 업데이트가 예상대로 작동하지 않습니다.

2 개의 제품 테이블 t1과 t2가 있습니다. t1은 실시간 데이터이고 t2는 가져온 데이터로 t1으로 업데이트하여 모든 새 제품 가격을 업데이트 할 준비가되었습니다. 그래서 나는 달린다 :

SELECT * FROM t1 
JOIN t2 ON t1.id = t2.id 
WHERE t1.price != t2.price; 

이것은 가격이 다르며 갱신되어야하는 1201 개의 레코드를 반환한다. 그래서 실행 : 여기 그래서 이미 0

뭔가 옳지 않다 : 1,143 변경 : 1143 경고

UPDATE t1 JOIN t2 ON t1.id = t2.id 
SET t1.price = t2.price 
WHERE t1.price != t2.price; 

이 1143 개 행 적용됨, 일치가 행 오류 및 보고서없이 완료됩니다. select 쿼리에서 1201 레코드가 다르지만 동일한 조인과 조건을 사용하여 1143 레코드 만 변경 되었습니까?

초기 선택 쿼리를 실행하면 58 개의 레코드가 여전히 가격이 다를 것으로 예상됩니다. 그러나 그것을 실행할 때 나는 처음에했던 것과 같은 1201을 얻습니다. 마치 업데이트가 커밋되지 않는 것과 같습니다.

아이디어가 있으십니까?

+0

테이블 entrie 모두 동일한 ID를 가지고 – sll

+0

모두't1.price'와'동일한 유형의 t2.price' 열입니다 – nobody

+0

무엇 sllev 수단 (내 생각)입니다 :?를인가 두 테이블의'id' 프라이 머리 키가 일치하지 않으면 그 이유가 있습니다 –

답변

5

SELECT이 나타내는 숫자 (1201)는 t1의 레코드가 아니고 두 테이블의 JOIN의 레코드입니다. 두 idUNIQUE 또는 PRIMARY KEY이 아닌 경우이 예상됩니다. t1의 일부 행은 t2의 여러 행과 일치합니다. UPDATE이 완료되면하지만 그들은 단지이 업데이트 문 중 WHERE 조건을 순차적으로 검사하는 MySQL의 "기능"또는 UPDATE의 "버그"입니다 (한 번 업데이트됩니다.

t1의 (얼마나 많은 행을 보려면이를보십시오) 업데이트해야합니다 :

SELECT * FROM t1 
WHERE EXISTS 
     (SELECT * 
     FROM t2 
     WHERE t1.id = t2.id 
      AND t1.price != t2.price 
    ); 
+0

그러나'JOIN t2 ON t1.id = t2.id' –

+0

@Tomalak : 나는'id'라고 불리는데도 그들 중 하나는 UNIQUE가 아니라고 생각합니다. 가능한 다른 설명이 있습니까? –

+0

두 가지 모두 PK임을 알았습니다. 그래서 나는 더 혼란 스럽습니다. 그리고 또한 '행 일치 : 1143 변경됨 : 1143'이라는 OP의 세부 정보가 표시되지만 커밋되지 않는 것으로 보이는 업데이트는 더욱 혼란 스럽습니다. –

관련 문제