2011-11-22 20 views
5

¿Es posible en MySQL + PHP aumentar un valor INT y devolver el nuevo valor dentro de una consulta?¿Puedo actualizar un valor INT + 1 y devolver el nuevo valor?

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

$updated_number = ??? 

O ¿Necesito publicar otra consulta?

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

tal vez un procedimiento almacenado ayudaría. –

+0

Creo que un procedimiento almacenado está en orden, ya que un incremento seguido de una selección conlleva la posibilidad de que se produzca otro incremento entre el incremento inicial y la selección. – Zikes

+0

O si está configurado para no usar un procedimiento almacenado, primero seleccione el número, luego agregue uno en php, luego actualice, para que el código pueda estar seguro de que está usando el número que lo actualizó. –

Respuesta

7

Respuesta simple - no, no es posible.

Respuesta más larga, sí, si utiliza un procedimiento almacenado que incrementa el valor de la ID especificada, recupera el nuevo valor y lo devuelve.

he acabo de probar esto bajo 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 

Uso:

CALL increment(uniqid) 

Si múltiples accesos simultáneos son posibles Es posible que desee LOCK la tabla primero para garantizar el funcionamiento de atomicity - MySQL aparentemente no permite que los procedimientos almacenados bloqueen las tablas ellos mismos.

+0

¿por qué el nuevo downvote? AFAICS ¡esto hace exactamente lo que el OP quiere! – Alnitak

7

No. Usted tendrá que seleccionar esa línea después

-1

que puede hacer

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

y utilizar mysql_next_result() para obtener los resultados.

+2

Esto no funcionará. No se pueden emitir múltiples consultas en una sola llamada de consulta. No está permitido por el controlador PHP mysql. –

-2

@luvPlsQL tiene razón. Pero básicamente necesitas obtener los datos primero, luego aumentarlos y luego actualizarlos. Por fin tienes la variable aumentada antes de la actualización para que puedas usarla.

0

Hay un camino sin procedimiento. Puede almacenar un nuevo valor en la variable de sesión y obtenerlo a partir de la siguiente declaración.

ACTUALIZACIÓN table SET number = (@next_value: = number + 1) WHERE id = 'uniqid';

hormiga entonces:

@next_value SELECT;

La variable de sesión no se ve afectada por otros incrementos.

Cuestiones relacionadas