So richten Sie Trigger in MySQL zum Kopieren eines Feldes ein
Frage
Ich habe eine interne Anwendung, die ich zusammengestellt habe, und ich bin im Allgemeinen sehr neu in SQL.
Ich habe eine Tabelle, die die meisten unserer Daten enthält. Stellen wir uns so aus, als ob es so aussieht.
Matrix
|Name | Description |
----------------------------------
|Server01 | First Server |
Jetzt habe ich einen weiteren Tisch hinzugefügt und so tun, als ob es so aussieht.
OtherInfo
|Name | Price |
----------------------------------
|Server01 | 100 |
Ich habe eine erste Kopie von Daten von Matrix zu einem anderenInfo durchgeführt. Die Leute werden Matrix Einträge hinzufügen, und ich möchte, dass der Name aus der Matrix in die andereInfo -Tabelle geht.
Grundsätzlich sollte das Namen des Namens immer replizieren, was sich in der Matrix befindet. Wenn etwas auf Matrix geändert oder gelöscht wird, sollte das Gleiche auf anderen INFO passieren.
Wie richte ich das ein?
Lösung
Erstellen Sie die folgenden vier (4) Auslöser auf der Matrixtabelle
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 ;
Was macht jeder Auslöser?
matrix_ai
Fügt den neuen Namen in einOtherInfo
Nachdem es eingefügt wurde inMatrix
matrix_bu
führt eine Validierung durch, um sicherzustellen, dass Sie den alten Namen nicht in einen neuen Namen ändern, der bereits in der Matrix -Tabelle vorhanden istmatrix_au
Aktualisiert den alten Namen in einem anderenInfo auf den neuen Namen, den Sie in Matrix aktualisiert habenmatrix_ad
Löscht den Namen von einem anderenInfo, den Sie gerade aus der Matrix gelöscht haben