Să presupunem că dorim să calculăm și să actualizăm un câmp , varsta
la data curentă, în tabelul persoane
ori de câte ori se introduce/actualizează data nașterii.
De asemenea, ne-ar interesa ca, de fiecare dată când actualizăm o înregistrare să se înscrie data şi ora curentă în câmpul data_upd
.
Crearea tabelei
1 2 3 4 5 6 7 8 9 10 |
DROP TABLE IF EXISTS persoane; CREATE TABLE persoane ( id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'ID-ul unic al persoanei', nume varchar(50) DEFAULT NULL COMMENT 'Numele persoanei', prenume varchar(50) DEFAULT NULL COMMENT 'Prenumele persoanei', data_nasterii date DEFAULT NULL COMMENT 'Data nașterii', varsta tinyint(3) DEFAULT NULL COMMENT 'Vârsta calculată', data_in timestamp NULL DEFAULT current_timestamp(), data_upd timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_romanian_ci COMMENT='studiu Triggeri'; |
Calcul vârstă
Vom crea două triggere, la inserare, dar şi la actualizare.
Crearea Triggerului pentru INSERT
1 2 3 4 5 6 7 8 |
DELIMITER $$ CREATE TRIGGER calc_varsta_before_insert BEFORE INSERT ON persoane FOR EACH ROW BEGIN SET NEW.varsta = TIMESTAMPDIFF(YEAR, NEW.data_nasterii, CURDATE()); END$$ DELIMITER ; |
Crearea Triggerului pentru UPDATE
1 2 3 4 5 6 7 8 |
DELIMITER $$ CREATE TRIGGER calc_varsta_before_update BEFORE UPDATE ON persoane FOR EACH ROW BEGIN SET NEW.varsta = TIMESTAMPDIFF(YEAR, NEW.data_nasterii, CURDATE()); END$$ DELIMITER ; |
Explicații ale componentelor trigger-ului:
DELIMITER
: schimbă delimitatorul standard (;
) pentru a permite folosirea sa în cadrul bloculuiBEGIN ... END
;CREATE TRIGGER calc_varsta_before_insert
/calc_varsta_before_update
: creează trigger numitcalc_varsta_before_insert
/calc_varsta_before_update
;BEFORE INSERT
: specifică faptul că triggerul se va executa înainte de a introduce un nou rând.BEFORE UPDATE
: specifică faptul că triggerul se va executa înainte de a actualiza un rând.SET NEW.varsta = TIMESTAMPDIFF(YEAR, NEW.data_nasterii, CURDATE())
: calculează vârsta ca diferență în ani dintre data nașterii (NEW.data_nasterii
) și data curentă (CURDATE()
).NEW.varsta
– valoarea câmpuluivarsta
care urmează să fie introdus.
Testare Trigger
- Inserare persoană nouă:
1 2 3 4 |
INSERT INTO persoane (nume, prenume, data_nasterii) VALUES ('Petreanu', 'Ion', '1972-04-05'); |
După ce această inserare se va completa automat câmpul varsta
cu valoarea calculată pentru Ion Petreanu.
- Actualizare persoană existentă. Presupunând că vrem să schimbăm numele, prenumele şi data naşterii înregistrării cu id-ul 3, vom aplica codul:
1 2 3 4 5 |
UPDATE persoane SET nume = 'Barbă' , prenume = 'Mihaela' , data_nasterii = '2004-05-01' WHERE id = 3; |
Update data actualizării
După orice actualizare a unei înregistrări, datorită trigger-ului de mai jos, vom avea inserată data şi ora curentă la momentul acelei operaţiuni.
1 2 3 4 5 6 7 8 |
DELIMITER $$ CREATE TRIGGER update_persoană_before_update BEFORE UPDATE ON persoane FOR EACH ROW BEGIN SET NEW.updated_at = NOW(); END$$ DELIMITER ; |