Cómo configurar los desencadenantes en MySQL para copiar un campo
Pregunta
Tengo una aplicación interna que he reunido, y soy muy nuevo en SQL en general.
Tengo una tabla que contiene la mayoría de nuestros datos. Finger que se vea así.
Matrix
|Name | Description |
----------------------------------
|Server01 | First Server |
Ahora agregué otra mesa y fingamos que se ve así.
OtherInfo
|Name | Price |
----------------------------------
|Server01 | 100 |
He hecho una copia inicial de los datos de Matrix a OtherInfo. La gente agregará entradas a Matrix, y quiero que el nombre de la matriz entre en la tabla OtroInfo.
Básicamente, el campo de nombre siempre debe replicar lo que está en Matrix. Si algo se cambia o se elimina en Matrix, lo mismo debería suceder en OtherInfo.
¿Cómo configuro esto?
Solución
Cree los siguientes cuatro (4) desencadenantes en la tabla de matriz
DELIMITER $$
CREATE TRIGGER matrix_ai AFTER INSERT ON Matrix FOR EACH ROW
BEGIN
INSERT IGNORE INTO OtherInfo (Name) VALUES (NEW.Name);
END; $$
CREATE TRIGGER matrix_bu BEFORE UPDATE ON Matrix FOR EACH ROW
BEGIN
DECLARE found_key,dummy INT;
SELECT COUNT(1) INTO found_key FROM Matrix WHERE Name = NEW.Name;
IF found_key = 1 THEN
-- Abandon the Trigger of Name already exists
SELECT data_length INTO dummy FROM information_schema.tables;
END IF;
END; $$
CREATE TRIGGER matrix_au AFTER UPDATE ON Matrix FOR EACH ROW
BEGIN
UPDATE OtherInfo SET Name=NEW.Name WHERE Name=OLD.Name;
END; $$
CREATE TRIGGER matrix_ad AFTER DELETE ON Matrix FOR EACH ROW
BEGIN
DELETE FROM OtherInfo WHERE Name=OLD.Name;
END; $$
DELIMITER ;
¿Qué hace cada disparador?
matrix_ai
Inserta el nuevo nombre enOtherInfo
Después de que se inserta enMatrix
matrix_bu
Realiza una validación para asegurarse de no cambiar el nombre antiguo en un nuevo nombre que ya existe en la tabla de matrizmatrix_au
Actualiza el nombre anterior en OtroInfo al nuevo nombre que actualizó en Matrixmatrix_ad
Elimina el nombre de OtherInfo que acabas de eliminar de Matrix
Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange