REPLACE [LOW_PRIORITY | DELAYED] [INTO]tbl_name
[(col_name
,...)] VALUES ({expr
| DEFAULT},...),(...),...
O:
REPLACE [LOW_PRIORITY | DELAYED] [INTO]tbl_name
SETcol_name
={expr
| DEFAULT}, ...
O:
REPLACE [LOW_PRIORITY | DELAYED] [INTO]tbl_name
[(col_name
,...)] SELECT ...
REPLACE
funciona exactamente como
INSERT
, excepto que si un valor de la tabla
tiene el mismo valor que un nuevo registro para un índice
PRIMARY KEY
o UNIQUE
, el
antiguo registro se borra antes de insertar el nuevo. Consulte
Sección 13.2.4, “Sintaxis de INSERT
”.
Tenga en cuenta que a menos que la tabla tenga un índice
PRIMARY KEY
, o UNIQUE
usar
un comando REPLACE
no tiene sentido. Es
equivalente a INSERT
, ya que no hay índice
para determinar si un nuevo registro duplica otro.
Los valores para todas las columnas se toman de los valores
especificados en el comando REPLACE
.
Cualquier columna no presente adquiere su valor por defecto,
como ocurre con INSERT
. No puede referirse a
valores del registro actual y usarlos en el nuevo registro. Si
usa un comando tal como SET
, la referencia
al nombre de columna en la parte derecha se trata como
col_name
=
col_name
+ 1DEFAULT(
,
así que es equivalente a col_name
)SET
.
col_name
=
DEFAULT(col_name
) + 1
Para ser capaz de usar REPLACE
, debe tener
los permisos INSERT
y
DELETE
para la tabla.
El comando REPLACE
retorna un contador con el
número de registros afectados. Esta es la suma de registros
borrados e insertados. Si el contador es 1 para
REPLACE
de un único registro, se inserta un
registro y no se borra ninguno. Si el contador es mayor que 1,
uno o más registros se borraron antes de insertar el nuevo. Es
posible para un único registro reemplazar más de un registro
antiguo si la tabla contiene múltiples índices únicos y el
nuevo registro duplica valores para distintos registros antiguos
en distintos índices únicos.
El contador de registros afectados hace fácil determinar si
REPLACE
sólo añadió un registro o si
también reemplazo alguno: Compruebe si el contador es 1
(añadido) o mayor (reemplazados).
Si usa la API de C, el contador de registros afectados puede
obtenerse usando la función
mysql_affected_rows()
.
Actualmente, no puede reemplzar en una tabla y seleccionar de la misma en una subconsulta.
Aquí sigue en más detalle el algoritmo usado (también se usa
con LOAD DATA ... REPLACE
):
Intenta insertar el nuevo registro en la tabla
Mientras falle la inserción debido a error de clave duplicada por clave única o primaria:
Borra de la tabla el registro conflictivo que tiene el valor de clave duplicada
Intenta insertar de nuevo el registro en la tabla
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.