Capítulo 12: Desencadenadores
Base de datos de ejemplo
Creación:
DROP DATABASE IF EXISTS videoteca;
CREATE DATABASE videoteca;
Tablas:
USE videoteca;
CREATE TABLE interprete
(
id INT NOT NULL AUTO_INCREMENT,
nombre VARCHAR(64) NOT NULL,
apellidos VARCHAR(64) NOT NULL,
PRIMARY KEY(id)
)
ENGINE = InnoDB;
CREATE TABLE interprete_ext
(
idinterprete INT NOT NULL,
imdb VARCHAR(32) NOT NULL,
carpeta VARCHAR(255) NOT NULL,
PRIMARY KEY(idinterprete),
INDEX ae_FK(idinterprete),
FOREIGN KEY(idinterprete) REFERENCES interprete(id)
)
ENGINE = InnoDB;
Inserciones:
USE videoteca;
INSERT INTO interprete
(
nombre,
apellidos
)
VALUES
(
'Harrison',
'Ford'
);
INSERT INTO interprete
(
nombre,
apellidos
)
VALUES
(
'Russell',
'Crowe'
);
INSERT INTO interprete_ext
(
idinterprete,
imdb,
carpeta
)
VALUES
(
1,
'nm0000148',
'harrison_ford'
);
INSERT INTO interprete_ext
(
idinterprete,
imdb,
carpeta
)
VALUES
(
2,
'nm0000128',
'russell_crowe'
);
Desencadenador de inserción
USE videoteca;
DELIMITER //
CREATE TRIGGER dc_interprete_insertar
AFTER INSERT ON interprete
FOR EACH ROW BEGIN
DECLARE nuevo_carpeta VARCHAR(255);
SET nuevo_carpeta = CONCAT
(
LOWER(NEW.nombre),
'_',
LOWER(NEW.apellidos)
);
INSERT INTO interprete_ext
(
idinterprete,
imdb,
carpeta
)
VALUES
(
NEW.id,
'',
nuevo_carpeta);
END
//
DELIMITER ;
Inserción de un nuevo intérprete:
USE videoteca;
INSERT INTO interprete
(
nombre,
apellidos
)
VALUES
(
'Tim',
'Robins'
);
Desencadenador de actualización
USE videoteca;
DELIMITER //
CREATE TRIGGER dc_interprete_actualizar
AFTER UPDATE ON interprete
FOR EACH ROW BEGIN
DECLARE nuevo_carpeta VARCHAR(255);
SET nuevo_carpeta = CONCAT(
LOWER(NEW.nombre),
'_',
LOWER(NEW.apellidos)
);
UPDATE
interprete_ext
SET
carpeta = nuevo_carpeta
WHERE
idinterprete = NEW.id;
END
//
DELIMITER ;
Cambiar el nombre del intérprete:
USE videoteca;
UPDATE
interprete
SET
apellidos = 'Robbins'
WHERE
id = 3;
Borrado
USE videoteca;
DELIMITER //
CREATE TRIGGER dc_interprete_eliminar
BEFORE DELETE ON interprete
FOR EACH ROW BEGIN
DELETE FROM
interprete_ext
WHERE
idinterprete = OLD.id;
END
//
DELIMITER ;
Borrar un interprete:
USE videoteca;
DELETE FROM
interprete
WHERE
id = 3;