2011-09-16 16 views
24

Ho cercato di trovare una risposta a questa domanda, ma non ho trovato alcun "sì" o "no" definitivo in tutte le mie ricerche.Ottieni il valore aggiornato in MySQL invece delle righe interessate

Sto correndo una semplice query MySQL come questa:

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

Esiste un modo per quella query per restituire il valore aggiornato, al posto del numero di righe interessate? Proprio come un riferimento, sto facendo questo in PHP, in modo che il codice vero e proprio si presenta come:

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

So che avrei potuto fare una seconda query e basta selezionare il valore, ma sto cercando di ridurre il domande il più possibile. C'è un modo?

+0

No, non penso ci sia. –

risposta

22

È possibile farlo con una stored procedure che si aggiorna e quindi seleziona il nuovo valore in un parametro di output. Quanto segue restituisce una colonna new_score con il nuovo valore.

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 ; 

In PHP:

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

Le prestazioni di questa operazione in una stored procedure sono migliori delle semplici due query SQL? – jwegner

+0

@jwegner Le prestazioni saranno probabilmente un po 'migliori perché l'RDBMS non deve analizzare nessuna delle query. Entrambi sono già stati compilati nella procedura sul lato RDBMS. –

+2

@jwegner Benchmark per essere sicuro che ... –

10

No, non c'è niente come UPDATE ... RETURNING output_expression di postgresql in MySQL (ancora?).

+3

Non aiuta molto con la domanda (se c'è effettivamente una risposta), ma +1 per un'informazione interessante! –

0

No non puoi. È possibile eseguire una funzione o una stored procedure che potrebbe eseguire l'inserimento e restituire il valore aggiornato, ma ciò richiederebbe comunque l'esecuzione di due query dalla funzione o dalla stored procedure.

-1

È possibile creare un trigger, e si sa tutto ciò che riguarda le modifiche.

1

Se non si desidera eseguire un'altra Query SELECT, ecco un altro modo per farlo. Ho modificato il codice Berkowski per riferimento:

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 ; 
Problemi correlati