2010-07-02 21 views
6

¿Cómo se puede obtener las filas exactas afectadas por la instrucción SQL UPDATE en MySQL?seleccionar las filas afectadas por una actualización

Tengo muchos clientes en muchos equipos que pueden actualizar filas en la misma tabla según las cláusulas WHERE en cualquier momento, y cada cliente necesita hacer algo en otro sistema para cada fila que afectan, por lo que obtener la lista de los artículos afectados deben ser precisos y no ser vulnerables a las condiciones de carrera.

Algunas bases de datos apoyan UPDATE ... OUTPUT UPDATED.id WHERE ... por ejemplo SQL Server.

¿Cómo se puede hacer esto atomic UPDATE/SELECT en MySQL?

(he visto sugerencias de hacer el SELECT primero y luego usando los identificadores como una cláusula IN en el UPDATE. Sin embargo, otro cliente puede ejecutar el mismo SELECT y recuperar las mismas filas, mientras que el primer cliente está en la cola de su UPDATE etc. ?)

Respuesta

2

Utilice bloqueo de tabla o transacciones (si es compatible con el motor de almacenamiento) para evitar condiciones de carrera.

LOCK TABLES tablename; 
SELECT * FROM tablename WHERE x. 
do something else 
UPDATE tablename SET y WHERE x. 
UNLOCK TABLES 
1

Esto es lo que he usado antes, y hay una instancia de otra persona a usarlo here on Stackoverflow:

UPDATE my_table SET 
    id = (SELECT @id := id), 
    <column> = 'value'   
    WHERE <condition>; 

@id contendrá el identificador de fila actualizada, o si n NULL o fila fue actualizada. Esto solo funcionaría para actualizaciones de una sola fila.

Cuestiones relacionadas