jueves, 1 de noviembre de 2012

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.



PROBLEMA RESUELTO:


Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla si existe:

 drop table if exists libros;

Creamos la tabla:

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

Ingresamos algunos registros:

 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);

Intentemos ingresar 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.

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);

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

Veamos los casos en los cuales "replace" funciona como "insert":

- ingresamos un registro sin valor de código:

 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.

- ingresamos un registro con un valor de código que 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.

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);

aparece un mensaje indicando que se afectó 1 registro (el ingresado), no se 
reemplazó ninguno y ahora hay 2 libros con código 10.


PROBLEMA PROPUESTO:


Un instituto de enseñanza guarda los datos de sus alumnos en la tabla "alumnos".

1- Elimine la tabla si existe:
 
2- Cree la tabla:
 create table alumnos(
  legajo int(10) unsigned auto_increment,
  nombre varchar(30),
  documento char(8),
  domicilio varchar(30),
  primary key(legajo),
  unique i_documento (documento)
 );

3- Ingrese algunos registros:
 insert into alumnos values('1353','Juan Lopez','22333444','Colon 123');
 insert into alumnos values('2345','Ana Acosta','24000555','Caseros 456');
 insert into alumnos values('2356','Jose Torres','26888777','Sucre 312');
 insert into alumnos values('3567','Luis Perez','28020020','Rivadavia 234');

4- Intente ingresar un registro con clave primaria repetida (legajo "3567"):
 
aparece un mensaje de error.

5- Ingrese el registro anterior reemplazando el existente:
 
6- Intente ingresar un alumno con documento repetido:
 

7- Reemplace el registro:
 
note que el alumno con documento "30000333" se eliminó y se reemplazó por el nuevo registro.

8- Elimine el índice único:
 
9- Ingrese con "replace" el siguiente registro con documento existente:
 
un registro afectado, no hubo eliminación solamente inserción.

10- Muestre todos los registros:
 
note que hay dos alumnos con el mismo número de documento.





6 comentarios:

  1. muy buena informacion, me fue muy util.!!!!!
    =) =) =) =) =) =) =)

    ResponderEliminar
  2. Buenos días! Muy útil tu información. Me sucede que al usar REPLACE en el programa que he creado, me duplica el registro y le asigna un nuevo ID en lugar de borrar el viejo y reemplazarlo. De este modo, tengo el viejo registro y el nuevo con los valores modificados. ¿Podrías decirme qué estoy haciendo errado? ¿Puedo enviarte el código por email (son 2 funciones: una que recoge los datos y otra que ejecuta el query)?

    ResponderEliminar