2011-11-22 12 views
5

È possibile in MySQL + PHP aumentare un valore INT e restituire il nuovo valore all'interno di una query?Posso aggiornare un valore INT + 1 e restituire il nuovo valore?

$sql = mysql_query("UPDATE table SET number=number+1 WHERE id='uniqid'"); 

$updated_number = ??? 

Oppure ho bisogno di inviare un'altra richiesta?

SELECT number FROM table WHERE id='uniqid' 
+2

forse una stored procedure potrebbe aiutare. –

+0

Penso che una procedura memorizzata sia in ordine, poiché un incremento seguito da una selezione comporta la possibilità che possa verificarsi un altro incremento tra l'incremento iniziale e la selezione. – Zikes

+0

Oppure, se non si utilizza una procedura memorizzata, selezionare prima il numero, quindi aggiungerne uno in php, quindi aggiornarlo, in modo che il codice possa essere sicuro che stia utilizzando il numero al quale lo ha aggiornato. –

risposta

7

Risposta semplice - no, non è possibile.

Risposta più lunga, sì, se si utilizza una stored procedure che incrementa il valore per l'ID specificato, recupera il nuovo valore e lo restituisce.

Ho appena testato questo sotto MySQL 5.1.59:

CREATE PROCEDURE increment (IN uniqid VARCHAR(255)) 
BEGIN 
    UPDATE `table` SET number = number + 1 WHERE id = uniqid; 
    SELECT number FROM `table` WHERE id = uniqid; 
END 

Usage:

CALL increment(uniqid) 

Se più accessi simultanei sono possibili si potrebbe desiderare di LOCK tavolo prima di garantire il funzionamento del atomicità: apparentemente, MySQL non consente alle stored procedure di bloccare le tabelle stesse.

+0

perché il nuovo downvote? AFAICS fa esattamente ciò che l'OP vuole! – Alnitak

7

No. È necessario selezionare quella linea dopo

-1

si può fare

status = mysql_query(mysql, 
        "UPDATE table SET number=number+1 WHERE id='uniqid';\ 
         SELECT FROM table WHERE id='uniqid';\ 
        "); 

e utilizzare mysql_next_result() per ottenere i risultati.

+2

Questo non funzionerà. Non è possibile emettere più query in una singola chiamata di query. Non è permesso dal driver mysql di PHP. –

-2

@luvPlsQL ha ragione. Ma in pratica devi prima ottenere i dati, poi aumentarli e poi aggiornarli. Alla fine hai ottenuto la variabile aumentata prima dell'aggiornamento, quindi puoi usarla.

0

C'è modo senza procedura. È possibile memorizzare un nuovo valore nella variabile di sessione e ottenerlo dalla prossima dichiarazione.

UPDATE table SET numero = (@next_value: = number + 1) WHERE id = 'uniqid';

formica poi:

SELEZIONA @next_value;

La variabile di sessione non è influenzata da altri incrementi.

Problemi correlati