2014-09-22 2 views
0

임 미안합니다. 질문이 이상하고 어리석은 것처럼 보일 수도 있지만 가능한지 또는 무엇이 가능한지 알아야합니다.mysql에서 업데이트 쿼리를 실행 한 후 업데이트 된 값을 반환하십시오.

그래서 요청 테이블의 요청 레코드 상태를 업데이트하는 다음 쿼리가 있습니다. 내가 바로 다른 선택 쿼리를 실행하지 않고 쿼리를 실행 한 후 업데이트 된 상태 필드의 값을 얻을 수 있다면

$updateQ = "UPDATE requests SET status = status+1 WHERE rid = '$rid'"; 
if($this->db->query($updateQ)) 
    return $this->db->select('status')->from('requests')->where('rid', $rid)->get()->row('status'); 

이 궁금하다.

+0

없이 당신이 그것을 얻을 수 없습니다, 업데이트 후, 당신이 얻을 수있는 유일한 방법은 영향을받는 있습니다 '1' 인 행 – Ghost

답변

1

아니요, 불가능합니다. 그리고 나는 당신이 그것에 대해 왜 걱정 하는지를 보지 못합니다. 제 생각 엔 rid이 기본 키입니다. 그러므로 나중에 SELECT은 매우 빠르므로 거의 눈치 채지 못할 것입니다.

+0

다국적 데이터베이스에서 이것은 원자가되는지 확인할 때까지는 신뢰할 수 없습니다 – karmendra

+0

@ka rmendra 나는 당신이 조금 혼란 스럽다고 생각합니다. 질문은 다른 선택 쿼리 **를 실행하지 않고 업데이트 된 값 **을 얻을 수 있다면 가능했습니다. 값이 다른 트랜잭션에 의해 다시 변경된 것은 아닙니다. 사실 [이 업데이트 유형의 진술은 안전합니다] (http://stackoverflow.com/questions/3821468/sql-atomic-increment-and-locking-strategies-is-this-safe). 그래서 제 대답은 잘못이 아닙니다. – fancyPants

+0

좋아, 동의 하긴하지만 답을 편집 할 때까지 다운 투표를 취소 할 수 없다. – karmendra

1

SELECT FOR UPDATE (mySQL의 경우) 또는 유사한 값을 사용하여 마지막 값을 업데이트하고 선택하는 데 원 자성을 사용해야합니다.

SELECT counter_field FROM child_codes FOR UPDATE; 
UPDATE child_codes SET counter_field = counter_field + 1; 

또는 당신이 당신의 업데이트를 마지막으로 삽입 된 ID를 취득하고자하는 경우 LAST_INSERT_ID()를 사용합니다.

UPDATE counters 
SET value = LAST_INSERT_ID(value) + 1 
WHERE id = 1; 

그리고 select-update-single-statement-race-condition

감사 통해 다음

SELECT LAST_INSERT_ID(); 

읽기, K

+0

이것은 좋은 정보입니다 ** ** 일반적으로 **,이 경우에는 꼭 필요한 것은 아닙니다. 어쨌든, upvote. – fancyPants

관련 문제