2011-09-16 2 views
24

이 질문에 대한 답변을 찾으려고했지만 모든 연구에서 확실한 "예"또는 "아니오"를 찾지 못했습니다. 영향을받는 대신 행의 수,영향을받는 행 대신 MySQL에서 업데이트 된 값 가져 오기

UPDATE item SET `score`=`score`+1 WHERE `id`=1 

업데이트 된 값을 반환하는 쿼리에 대한 방법이 있나요 :

는이 같은 간단한 MySQL의 쿼리를 실행하는거야? 그냥 참고로, 같은 실제 코드가 보이는, 그래서 나는, PHP에서 이런 일을 해요 : 내가 두 번째 질의를하고 바로 값을 선택할 수 있습니다 알고

$sql = "UPDATE item SET `score`=`score`+1 WHERE `id`=1"; 
$new_value = mysql_query($sql); 
//Unfortunately this does not return the new value 

,하지만 난 줄이려고 노력하고있어 가능한 많은 쿼리. 방법이 있습니까?

+0

아니요, 나는 없을 것입니다. –

답변

22

업데이트 된 저장 프로 시저를 사용하여 새 값을 출력 매개 변수로 선택할 수 있습니다. 다음은 하나의 열 new_score을 새 값으로 반환합니다. PHP에서

DELIMITER $$ -- Change DELIMITER in order to use ; withn the procedure 
CREATE PROCEDURE increment_score 
(
    IN id_in INT 
) 
BEGIN 
    UPDATE item SET score = score + 1 WHERE id = id_in; 
    SELECT score AS new_score FROM item WHERE id = id_in; 
END 
$$   -- Finish CREATE PROCEDURE statement 
DELIMITER ; -- Reset DELIMITER to standard ; 

:

$result = mysql_query("CALL increment_score($id)"); 
$row = mysql_fetch_array($result); 
echo $row['new_score']; 
+1

두 SQL 쿼리를 수행하는 것보다 스토어드 프로 시저에서이 작업을 수행하는 것이 더 나은가? – jwegner

+0

@jwegner RDBMS가 쿼리 중 하나를 구문 분석 할 필요가 없으므로 성능이 조금 좋아질 것입니다. 둘 다 이미 RDBMS 측의 절차에서 컴파일됩니다. –

+2

@jwegner 그래도 벤치마킹 할 수 있습니다 ... –

10

아니요, postgresql의 UPDATE ... RETURNING output_expression (아직?)과 비슷한 점은 없습니다.

+3

질문에 도움이되지는 않습니다 (실제로 답변이있는 경우). 흥미로운 정보는 +1입니다! –

0

아니요. 삽입을 수행하고 업데이트 된 값을 반환 할 수있는 함수 나 저장 프로 시저를 만들 수는 있지만 여전히 함수 또는 저장 프로 시저 내에서 두 개의 쿼리를 실행해야합니다.

-1

당신은 트리거를 만들 수 있습니다, 당신은 수정에 대한 모든 것을 알 수 있습니다.

1

다른 SELECT를 실행하지 않으려면 여기에 다른 방법이 있습니다. 참조 용으로 Berkowski 코드를 수정했습니다 :

DELIMITER $$ 
CREATE PROCEDURE increment_score 
(
    IN id_in INT 
) 
BEGIN 
    set @newScore := null; 
    UPDATE item SET score = IF((@newScore := score+1) <> NULL IS NULL, @newScore, NULL) WHERE id = id_in; 
    SELECT @newScore; 
END 
DELIMITER ;