2012-01-15 22 views
9

¿Existe una manera eficiente de obtener la lista de identificadores de fila afectados (no el número de filas afectadas a través de mysql_affected_rows() de PHP, sino los identificadores de fila reales que se vieron afectados) de una consulta UPDATE o DELETE en mysql?¿ACTUALIZAR/ELIMINAR en mysql y obtener la lista de identificadores de fila afectados?

En postgresql, hay una cláusula de DEVOLUCIÓN en las consultas de ACTUALIZAR/ELIMINAR que se pueden usar para especificar valores de las filas afectadas que se devuelven.

En mysql, la forma de 'fuerza bruta' de obtener las filas afectadas parece ser: 1. Adquiera READ LOCK. 2. SELECCIONAR con la condición WHERE de la consulta ACTUALIZAR/ELIMINAR para obtener los identificadores de fila afectados. 3. ACTUALIZAR/ELIMINAR. 4. RELEASE LOCK.

La forma anterior parece muy ineficiente. ¿Hay una forma más eficiente de obtener los identificadores de fila afectados en mysql?

+0

hicieron mi trabajo respuesta? – redmoon7777

Respuesta

9

probar esto, devolverá los identificadores actualizados como "1,2,3 ....":

SET @uids := ''; 
UPDATE table_name 
    SET some_col= 'some_val' 
WHERE some_col= 'some_val' 
    AND (SELECT @uids := CONCAT_WS(',', @uids, id)); 
SELECT TRIM(LEADING ',' FROM @uids); 
+0

Debería abrir una nueva pregunta sobre eso, porque es un caso diferente. También debe incluir la consulta que utilizó y los errores que se informaron. (si es así, proporciónenme el enlace a la nueva pregunta y estaré encantado de ayudarlo) – redmoon7777

+0

Lo resolví, estaba escribiendo mi comentario y mi ejemplo, y el editor no me permitió obtener una nueva línea, así que no importa. . – Dan

13

Se puede crear un soporte Trigger

para disparadores se incluye comenzando con MySQL 5.0.2. Un desencadenador es un objeto de base de datos nombrado que está asociado a una tabla y que se activa cuando se produce un evento particular para la tabla.

El siguiente código crea un disparador en una tabla llamada mytable que tiene un campo id

CREATE TRIGGER mytable_delete 
AFTER DELETE ON mytable 
FOR EACH ROW SET @deletedIDs = CONCAT_WS(',', @deletedIDs, OLD.id) 

aviso de que OLD se refiere a fila eliminada

una vez que ha creado un disparador en una mesa que pueda úselo de la siguiente manera:

/* empty parameter defined in CREATE TRIGGER */ 
Set @deletedIDs = ''; 
/* perform your query */ 
DELETE FROM mytable WHERE myotherfield = 'myfilterevalue'; 
/* get the parameter */ 
SELECT @deletedIDs AS 'Deleted_IDs'; 

este w enferma de retorno identificadores eliminados cada uno precedido por una coma en una cadena

+0

Sugiero usar este disparador. 'CREATE TRIGGER mytable_delete DESPUÉS Eliminar en mitabla PARA CADA @deletedIDs conjunto de filas = TRIM (Principal '' FROM CONCAT_WS ('', @deletedIDs, OLD.id))' Esto elimina la coma líder. – Sirio

Cuestiones relacionadas