Listado completo de tutoriales

48 - Remplazar registros (replace)


"replace" reemplaza un registro por otro.

Cuando intentamos ingresar con "insert" un registro que repite el valor de un campo clave o indexado con índice único, aparece un mensaje de error indicando que el valor está duplicado. Si empleamos "replace" en lugar de "insert", el registro existente se borra y se ingresa el nuevo, de esta manera no se duplica el valor único.

Si tenemos la tabla "libros" con el campo "codigo" establecido como clave primaria e intentamos ingresar ("insert") un valor de código existente, aparece un mensaje de error porque no está permitido repetir los valores del campo clave. Si empleamos "replace" en lugar de "insert", la sentencia se ejecuta reemplazando el registro con el valor de código existente por el nuevo registro.

Veamos un ejemplo. Tenemos los siguientes registros almacenados en "libros":

codigo	 titulo		autor		editorial	precio
_______________________________________________________________
10	Alicia en ..	Lewis Carroll	Emece		15.4
15	Aprenda PHP	Mario Molina	Planeta		45.8
23	El aleph	Borges		Planeta		23.0

Intentamos insertar un registro con valor de clave repetida (código 23):

 insert into libros values(23,'Java en 10 minutos','Mario Molina','Emece',25.5);

Aparece un mensaje de error indicando que hay registros duplicados.

Si empleamos "replace":

 replace into libros values(23,'Java en 10 minutos','Mario Molina','Emece',25.5);

la sentencia se ejecuta y aparece un mensaje indicando que se afectaron 2 filas, esto es porque un registro se eliminó y otro se insertó.

"replace" funciona como "insert" en los siguientes casos: - si los datos ingresados no afectan al campo único, es decir no se ingresa valor para el campo indexado:

 replace into libros(titulo,autor,editorial,precio)
  values('Cervantes y el quijote','Borges','Paidos',28);

aparece un mensaje indicando que se afectó un solo registro, el ingresado, que se guarda con valor de código 0.

- si el dato para el campo indexado que se ingresa no existe:

 replace into libros values(30,'Matematica estas ahi','Paenza','Paidos',12.8);

aparece un mensaje indicando que se afectó solo una fila, no hubo reemplazo porque el código no existía antes de la nueva inserción.

- si la tabla no tiene indexación. Si la tabla "libros" no tuviera establecida ninguna clave primaria (ni índice único), podríamos ingresar varios registros con igual código:

 replace into libros values(1,'Harry Potter ya la piedra filosofal','Hawking','Emece',48);

aparecería un mensaje indicando que se afectó 1 registro (el ingresado), no se reemplazó ninguno y ahora habría 2 libros con código 1.

Servidor de MySQL instalado en forma local.

Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones SQL:

drop table if exists libros;

create table libros(
  codigo int unsigned default 0,
  titulo varchar(40),
  autor varchar(30),
  editorial varchar(20),
  precio decimal(5,2) unsigned,
  primary key(codigo)
 );

insert into libros 
   values (10,'Alicia en el pais de las maravillas','Lewis Carroll','Emece',15.4);
insert into libros 
   values (15,'Aprenda PHP','Mario Molina','Planeta',45.8);
insert into libros values (23,'El aleph','Borges','Planeta',23.0);

-- ntentemos ingresar un registro con valor de clave repetida (genera error)
insert into libros values(23,'Java en 10 minutos','Mario Molina','Emece',25.5);

-- Para reemplazar el registro con clave 23 por el nuevo empleamos "replace":
replace into libros values(23,'Java en 10 minutos','Mario Molina','Emece',25.5);

-- ingresamos un registro sin valor de código:
replace into libros(titulo,autor,editorial,precio)
  values('Cervantes y el quijote','Borges','Paidos',28);

-- ingresamos un registro con un valor de código que no existe:
replace into libros values(30,'Matematica estas ahi','Paenza','Paidos',12.8);

-- Quitemos la clave primaria:
alter table libros drop primary key;

-- Ingresamos un registro con valor de código repetido usando "replace":
replace into libros values(10,'Harry Potter ya la piedra filosofal','Hawking','Emece',48);

select * from libros;

Genera una salida similar a esta:

MySQL replace

Retornar