2013-03-12 3 views
7

가 나는 다음과 같은 쿼리있어 :PDO lastInsertId()는 중복 키 업데이트시 사용하면 0을 반환합니다.

$a = $members->prepare("insert into a(name) values(:name) 
          on duplicate key update name = :name"); 

을 그리고 내가 할 때 쿼리가 성공적으로 행을 삽입 한 경우

$insert_id = $a->lastInsertId()

, 예상대로 삽입 ID를 반환합니다 행을 업데이트하면 예상대로 (일종의) 업데이트 된 행 ID가 반환됩니다. 그러나 모든 것이 동일하기 때문에 아무것도 삽입하거나 업데이트하지 않으면 단지 0 만 반환됩니다.

이것은 꽤 논리적 인 기본 동작이지만이 방법을 사용하면 해당 ID를 반환 할 수 있습니다. 행에서 실제로 변경 될 때처럼 업데이트하려고 시도한 행.

감사합니다.

답변

16

는 이에 대한 답을 찾을 수있는 많은 장소가 있지만 아래에 언급 한 바와 같이 PDO의 특이도는, ...

첫째는 ON DUPLICATE 절에 id=LAST_INSERT_ID(id)을 추가해야합니다 검색 결과를 방해 할 수있다 the DOCS입니다. 이 경우 id이 기본 키의 열 이름입니다 (따라서 귀하의 경우에는 id이라는 제목이 붙을 수도 있고 아닐 수도 있습니다).

또한 작동 시키려면 시퀀스 오브젝트 인수를 ->lastInsertId()으로 지정해야 할 수도 있습니다. 전에 특정 상황에서 그 문제가 발생했습니다.

+0

다행히도/불행히도 (어떻게 보느냐에 따라 다름) MySQL은'AUTO_INCREMENT' 시퀀스 만 가지고 있으므로 비표준 확장이 없으면 인수가없는'MySQL'' -> lastInsertId()'에 대해 괜찮습니다. , 'PostreSQL'과는 반대이다. – Wrikken

2

아니요, 업데이트 할 행이 없으므로 없습니다. 또한주의해야합니다. 동일한 세션에서 이전에 다른 삽입 쿼리가있는 경우 이전 쿼리에서 LAST_INSERT_ID() 값을 얻을 수 있습니다.

관련 문제