2010-02-16 15 views
5

Estoy tratando de obtener la nueva calificación de una instrucción UPDATE en Javavalor obtener de fila actualizada

int userID = 99; 

String sql = "UPDATE table SET rating=rating+1 WHERE user_REF="+userID; 
statement.executeUpdate(sql); 

yo sólo puede hacer otra instrucción SELECT, pero no hay una mejor manera de recuperar el valor o fila mientras se actualiza?

Respuesta

1

En MySQL:

$query1 = 'UPDATE `table` SET rating = (@rating:= rating) + 1 WHERE id = 1'; 
$query2 = 'select @rating'; 
0

Sé prudente que la mayoría de las soluciones dependen de base de datos (si desea o no que la independencia de la base de datos de la aplicación por supuesto, asuntos).

también otra solución que podría intentar es escribir un procedimiento y ejecutarlo de la siguiente manera

my_package.updateAndReturnRating(refId, cursor record). 

Por supuesto esto puede/no puede hacer que la solución en sí complicado, pero vale la pena una "evaluación" al menos.

2

En resumen, no, no hay forma de hacerlo con ANSI SQL estándar.

Tiene tres opciones:

1) lo hacen en dos consultas - la actualización, a continuación, el selecto

2) Crear un procedimiento almacenado que se ejecutará la actualización y luego regresar al selecto

3) Use una extensión específica de DB, como la cláusula de devolución de PostgreSQL

Tenga en cuenta que las opciones 2) y 3) son específicas de la base de datos.

1

gracias por la que todo el mundo respuestas, que terminé haciendo de esta manera:

int userID = 99; 

String sql = "SELECT id, rating FROM table WHERE user_REF="+userID; 
ResultSet rs = statement.executeQuery(sql); 

rs.first(); 
float oldRating = rs.getFloat("rating"); 
float newRating = oldRating +1; 

rs.updateFloat("rating", newRating); 
rs.updateRow(); 

return newRating; 

de esa manera (o al menos parece) no sólo una consulta para encontrar la fila correcta, o estoy equivocado?

+0

esto es incorrecto. Todavía está haciendo dos consultas ... una para seleccionar la calificación anterior, y otra para actualizar a la nueva calificación, y además de eso, al no hacer 'calificación = calificación +1' en SQL, ha introducido un condición de carrera en su secuencia de comandos. ¿Qué sucede si dos usuarios ejecutan este script al mismo tiempo? Ambos seleccionarán la calificación anterior, y ambos actualizarán el valor a la calificación anterior más uno. Hacerlo dentro de SQL de la forma en que mi respuesta proporcionó garantizará que se eviten las condiciones de carrera. –

+0

genial. Muchas gracias por las informaciones, lo haré a tu manera. – iddqd

Cuestiones relacionadas