Come impostare i trigger in MySQL per la copia di un campo
Domanda
Ho un'applicazione in-house che ho messo insieme, e io sono molto nuovo a SQL in generale.
Ho una tabella che contiene la maggior parte dei nostri dati. Facciamo finta che assomiglia a questo.
Matrix
|Name | Description |
----------------------------------
|Server01 | First Server |
Ora ho aggiunto un altro tavolo e facciamo finta che assomiglia a questo.
OtherInfo
|Name | Price |
----------------------------------
|Server01 | 100 |
Ho fatto una copia iniziale dei dati da Matrix a OtherInfo. La gente sarà l'aggiunta di voci di Matrix, e voglio che il nome da Matrix per andare nella tabella OtherInfo.
In sostanza, il campo Nome deve sempre replicare ciò che è in Matrix. Se qualcosa viene modificata o cancellata su Matrix, la stessa cosa dovrebbe accadere in OtherInfo.
Come faccio a impostare questo?
Soluzione
Creare la seguente quattro (4) Trigger sul tavolo Matrix
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 ;
Che cosa fa ogni trigger fare?
- Inserisce
matrix_ai
il nuovo nome inOtherInfo
dopo che è stato inserito nellaMatrix
- esegue
matrix_bu
una convalida per assicurarsi che non si cambia il vecchio nome in un nome nuovo che già esiste nella tabella di Matrix - Aggiornamenti
matrix_au
il vecchio nome in OtherInfo per il nuovo nome aggiornati in Matrix - cancella
matrix_ad
il Nome da OtherInfo che appena eliminata da Matrix