Páginas

jueves, 21 de febrero de 2013

Como usar innoDB MySql cascade delete update

Ejemplo práctico

Creamos dos tablas padre e hijo


Tabla padre alumnos
CREATE  TABLE `alumnos` (
  `id_alumno` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(45) NULL ,
  `apellido` VARCHAR(45) NULL ,
  PRIMARY KEY (`id_alumno`) );

Tabla hijo datos
CREATE  TABLE `datos` (
  `id_alumno` INT UNSIGNED NOT NULL ,
  `facebook` VARCHAR(45) NULL ,
  `twitter` VARCHAR(45) NULL ,
  `google` VARCHAR(45) NULL ,
  PRIMARY KEY (`id_alumno`) );


Hacemos las relaciones entre las tabla padre e hijo


En la tabla hijo debemos decirle de que id depende para que cuando se borre o actualice la tabla padre también cambie

Tabla hijo
ALTER TABLE `datos` 
  ADD CONSTRAINT `id_alumno`
  FOREIGN KEY (`id_alumno` )
  REFERENCES `alumnos` (`id_alumno` )
  ON DELETE CASCADE
  ON UPDATE CASCADE
, ADD INDEX `id_alumno_idx` (`id_alumno` ASC) ;
Llenamos las tablas con datos, tiene que ser en este orden sino no te deja ;)
Tabla padre alumnos
INSERT INTO `alumnos` (`nombre`, `apellido`) VALUES ('nombre_1', 'apellido_1');
INSERT INTO `alumnos` ( `nombre`, `apellido`) VALUES ('nombre_2', 'apellido_2');
INSERT INTO `alumnos` (`nombre`, `apellido`) VALUES ('nombre_3', 'apellido_3');

Tabla hijo datos
INSERT INTO `datos` (`id_alumno`, `facebook`, `twitter`, `google`) VALUES ('1', 'facebook_1', 'twitter_1', 'google_1');
INSERT INTO `datos` (`id_alumno`, `facebook`, `twitter`, `google`) VALUES ('2', 'facebook_2', 'twitter_2', 'google_2');
INSERT INTO `datos` (`id_alumno`, `facebook`, `twitter`, `google`) VALUES ('3', 'facebook_3', 'twitter_3', 'google_3');

Probamos eliminando y actualizando la tabla padre (alumnos) 

Prueba borrar alumno (de la tabla padre alumnos), se debería borrar los datos pertenecientes a la tabla hijo (datos)
delete from alumnos where id_alumno=2;

Prueba actualizar alumno (de la tabla padre alumnos), se debería actualizar los datos pertenecientes a la tabla hijo (datos)
update alumnos set nombre='nombre6',apellido='apellido6',id_alumno=6 where id_alumno=3;


Vemos que todo funciono correctamente

select * from alumnos;
select * from datos;

Notas importantes

  • NO PODRÁN BORRAR datos de la tabla DATOS mientras exista esa relación
  • NO SE PUEDE PONER en la tabla datos el campo id_alumno como autoincremental ya que el campo ya es único
    en la tabla alumnos error que siempre tenemos al relacionar las tablas, crear un id único y autoincremental en todas las tablas
    ojo yo recién lo estoy aprendiendo :D
  • En el caso de insertar se deberá insertar primero en la tabla alumnos y con el id_alumno, insertar luego registros en la tabla datos, si queremos hacerlo al revés "NO SE PUEDE"

Espero que les sirva de algo, lo hice porque personalmente me ayuda mucho cuando necesito el código jajaja