2011-04-12 5 views
2

하나의 기본 키가있는 MySQL 테이블이 있습니다.mysql_affected_rows()는 '실제'에 1을 반환합니다. REPLACE INTO

야간에 레코드를 삽입하고 업데이트하는 작업을 실행합니다. 각 작업마다 REPLACE INTO을 사용하므로 기존 행을 추가하거나 바꿉니다.

REPLACE INTO 쿼리 후 나는 실제로 대체 된 많은 행에 대해 1의 수를 반환하는 mysql_affected_rows()을 호출하고 '새'가 아닌 (대체되는 대다수 행에 대해 2를 반환합니다).

일괄 업데이트의 시작과 끝에서 행 수를 추적하기 때문에 이러한 '삽입'중 일부는 거짓임을 알고 있습니다. 테이블에 그 카운트를 버릴 중복이 없으며 배치 업데이트 전에 존재했던 '새로운'행을 확인했습니다.

이 테이블에는 특별한 것이 없습니다. 유사한 테이블은 동일한 코드로 동작합니다. 누구나 mysql_affected_rows()이 실제로 대체되고 삽입되지 않는 작업에 대해 1을 반환하는 이유는 무엇입니까?

답변

2

REPLACE INTO는 실제로 UPDATE가 아닌 DELETE를 수행 한 다음 INSERT를 수행합니다.

대신 INSERT ... ON DUPLICATE KEY UPDATE 구문을 사용하는 것이 좋습니다.

+0

행이 이미 존재하면 REPLACE가 삭제/삽입을 수행한다는 것을 알고 있습니다. 저에게 저주받은 이유가 무엇입니까 - mysql_affected_rows()가 2를 분명히 반환해야 할 때 1을 반환하는 이유는 무엇입니까? 앞에서 언급했듯이이 코드는 동일한 테이블에서 작동하므로 mysql_affected_rows()가 1을 반환하는 이유를 알아 내려고합니다. 중복을 사용할 수 있지만 모든 열 및 값 레이블이 두 번 필요합니다 INSERT INTO & ON DUPLICATE에 대해. 600+ 개 열이 많습니다. 열 사이의 변경 사항을 계산할 수 있지만 SELECT를 수행하면 REPLACE를 사용하는 지점을 1 위 자리에서 물리 칠 수 있습니다. –

관련 문제