REPLACE
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},...),(...),...
O:
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name SET col_name={expr | DEFAULT}, ...
O:
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] SELECT ...
REPLACE trabaja exactamente igual que INSERT, excepto que si existe algún registro viejo en la tabla que tenga el mismo valor que uno nuevo para un índice PRIMARY KEY o UNIQUE, el viejo se borra antes de que el nuevo sea insertado.
Hay que tener en cuenta que salvo que la tabla tenga una PRIMARY KEY o un índice UNIQUE, usar una sentencia REPLACE no tiene sentido. En ese caso es equivalente usar una sentencia INSERT, ya que no hay ningún índice que se pueda usar para determinar si una nueva fila duplica a otra.
Los valores para todas las columnas se toman de los valores especificados en la sentencia REPLACE. A cualquier columna perdida se le asigna su valor por defecto, justo lo mismo que ocurre con INSERT. No es posible referirse a los valores de la columna vieja y usarlos en la nueva. Podría parecer que era posible hacerlo en algunas versiones anteriores de MySQL, pero se trataba de un error que ha sido corregido.
Para poder usar REPLACE, se deben poseer los privilegios INSERT y DELETE para la tabla.
La sentencias REPLACE devuelve un contador para indicar el número de filas afectadas. Ese número es la suma de filas borradas e insertadas. Si el contador es 1 para un REPLACE de una única fila, la fila fue insertada y no se borró ninguna fila. Si el contador es mayor de 1, una o más de las viejas filas fue borrada antes de que la nueva fila fuese insertada. Es posible que una única fila reemplace a más de una fila vieja si la tabla contiene varios índices únicos y la nueva fila duplica valores de diferentes filas viejas en diferentes índices únicos.
El contador de filas afectadas hace sencillo determinar si REPLACE sólo ha añadido una fila o si ha reemplazado alguna fila: Compronar si el contador es 1 (añadida) o mayor (reeplazada).
Si se está usando el API C, el contador de filas afectadas se puede obtener usando la función mysql_affected_rows().
Actualmente, no es posible reemplazar en una tabla y seleccionar de la misma tabla en una subconsulta.
A continuación se muestra con más detalle el algoritmo que se usa (también se usa con LOAD DATA ... REPLACE):
- Intenta insertar la nueva fila en la tabla.
- Mientras la inserción falle porque ocurra un error de clave duplicada para una clave primaria o única:
- Borrar de la tabla la fila conflictiva que que tenga el valor de clave duplicado.
- Intentar la inserción de la nueva fila en la tabla otra vez.