lunes, 18 de abril de 2016

Primeros Pasos en MySQL - Actualizar en Cascada y Borrar en Cascada en MySQL o Maria DB (Update, Delete on Cascade)

Buenas noches queridos lectores, ésta noche les escribiré sobre la actualización y borrado en cascada en MariaDB (MySQL), en los post anteriores, ya vimos como crear tablas y ligarlas con otras tablas, con el fin de crear integridad referencial, partimos de que tenemos dos tablas creadas, la de PAIS y CIUDAD, sabemo que la tabla de CIUDAD se liga a la tabla de país por el campo cod_pais, pero, ¿qué pasa si me equivoque en el código del país y quiero que el código de México, en lugar de ser 'MEX', sea simplemente 'MX'? Vamos a averiguarlo juntos, les dejo el código de lo que llevamos hecho hasta ahora.



/*CREATE DATABASE PAISES
CHARACTER SET latin1
COLLATE latin1_swedish_ci;

USE PAISES

CREATE TABLE IF NOT EXISTS PAIS
(cod_pais char (4) PRIMARY KEY,
nombre varchar(50),
fecha_independencia date);

create table CIUDAD
(cod_ciudad varchar(4) PRIMARY KEY,
nombre varchar(50),
cod_pais char(4),
capital bool,
CONSTRAINT cod_pais_fk FOREIGN KEY (cod_pais) REFERENCES pais (cod_pais));

insert into pais  values ('MEX', 'MEXICO','18210921');
insert into ciudad values ('GDL', 'Guadalajara', 'MEX', false);
insert into pais values ('PERU', 'Peru', '18210728');
insert into ciudad values ('LIM', 'Lima', 'PERU', true);


insert into ciudad values ('MXCD', 'Ciudad de México', 'MEX', true);
insert into ciudad values ('MTY', 'Monterrey','MEX', false);
insert into ciudad values ('TOL', 'Toluca', 'MEX', false);
insert into ciudad values ('CZO', 'Cuzco', 'PERU', false);
insert into ciudad values ('ARE', 'Arequipa', 'PERU', false);
insert into pais  values ('GUA', 'Guatemala','18210915');
delete from pais
where cod_pais = 'GUA'
update  pais
set fecha_independencia = '18100927'

where cod_pais='MEX';

UPDATE CASCADE


Ejercicio 1
Actualizar el código del país México que actualmente es MX y sustituirlo por el código MEX, utilizando la clausula UPDATE

Primero, consultamos cual es el código actual del país México

select * from pais;

Y obtenemos el siguiente resultado

Ahora, confirmaremos en la tabla de ciudades que, en efecto las ciudades pertenecientes a México, tienen por código MX

select * from ciudad;


Intentaremos cambiar el código de la ciudad con el comando UPDATE desde la tabla de CIUDAD.

update ciudad set cod_pais ='MX'
where cod_pais = 'MEX';

Al ejecutar la sentencia obtenemos el siguiente error:


Analicemos el mensaje, el mensaje de error aparece debido a que si yo actualizo el código del país en la tabla ciudad, estaré rompiendo la integridad de los datos, puesto que no hay ningún país con código MX, si se pudieran cambiar, quedarían esas ciudades digamos "volando" ya que no podrían relacionarse con ningún país, por eso el error que hace mención que no se puede actualizar el registro, ya que una llave foránea fallaría. 

Vamos ahora a intentar actualizar la tabla PAIS

update pais set cod_pais ='MX'
where cod_pais = 'MEX'

Al ejecutar la sentencia muestra el siguiente error:


Como puden ver queridos lectores el error es el mismo, ¿porque?, porque si yo cambio el código del país, quedarían ciudades que no enlazan con ningún país, creando errores de integridad, pero ¿Cual sería la solución, pues sencillo, tenemos que indicarle a MySQL (MariaDB), que queremos que nos actualice en cascada en la tabla ciudad, para ello tenemos primeramente que eliminar la llave foránea momentáneamente, para eso tenemos que saber el nombre de la llave foránea, mismo que nos da el mensaje de error 'ciudad_cod_pais_fk', para borrar la llave foránea ejecutaremos la siguiente sentencia

alter table ciudad drop foreign key ciudad_cod_pais_fk

Con este comando borramos la llave foránea y ahora la volvemos a agregar

alter table ciudad add(
constraint ciudad_cod_pais_fk foreign key (cod_pais) references Pais (cod_pais) on update cascade)

Con esta sentencia le decimos que vamos a alterar la tabla ciudad y le vamos a agregar un constraint, es decir agregaremos una llave, el nombre de esa llave es ciudad_cod_pais_fk, pero ustedes pueden ponerle el nombre que gusten, la línea importante es: on update cascade. Una vez actualizada la base de datos, intentamos ahora actualizar la tabla de pais el código de México

update pais set cod_pais ='MX'
where cod_pais = 'MEX'

select * from pais;



Como ven, el código del país MEX, ya cambió por MX, pero lo interesante será cuando consultemos la tabla de ciudad


Como ven, la tabla actualizó automáticamente el código de las ciudades que hacen referencia a México, esto solo se puede lograr teniendo la tabla correctamente relacionada, así que por favor, relacionen de manera correcta sus tablas.

DELETE CASCADE


Ya vimos el actualizado en cascada (UPDATE CASCADE), ahora lo que queremos hacer es borrar las ciudades, que esten relacionadas a un país que ha sido borrado, por ejemplo y borro el país PERU, todas las ciudades que pertenecen a Perú también serán borradas, no es muy recomendable el Delete Cascade por el hecho de que representa mayor seguridad que no nos permita borrar hasta que se borren todas las ciudades que borrar el pais y se borren las ciudaes automáticamente, pero les puede servir de igual manera, 

Ejercicio 2
Eliminar el país PERU y borrar todas sus ciudades vinculadas, utilizando la sentencia DELETE

delete from pais where cod_pais ='PERU'

Al ejecutar este comando nos aparecerá el mismo error anterior, haciendo referencia a una llave foránea que no se puede actualizar porque rompería la integridad de los datos



Haremos lo mismo que para el update cascade, primero borraremos la llave foránea y la volveremos a crear, como ven ahora tiene el update cascade y el delete on cascade en la misma intrucción, se puede usar una u otra o ambas.

alter table ciudad add(
constraint ciudad_cod_pais_fk
foreign key (cod_pais) references Pais (cod_pais)
on update cascade on delete cascade)

Ahora borraremos el país Peru

delete from pais
where cod_pais = 'PERU'

Verificamos y comprobamos que el país Perú fue borrado correctamente

select * from pais;


Como ven, ya no se encuentra rastro de Perú y al decir rastro quiere decir que tampoco en ciudades encontraremos nada

select * from ciudad;


Hasta aquí el post queridos lectores, espero haya sido de su agrado y de su utilidad, espero comenten, compartan, den +1 o algun clic en un anuncio publicitario, cualquier duda pregunten, estamos para servirles. Muchas gracias y un abrazo














Banderas de Visitantes

Flag Counter