Как настроить триггеры в MySQL для копирования поля
Вопрос
У меня есть собственное приложение, которое я собрал вместе, и я очень новичок в SQL в целом.
У меня есть таблица, которая содержит большинство наших данных. Давайте притворимся, что это выглядит так.
Matrix
|Name | Description |
----------------------------------
|Server01 | First Server |
Теперь я добавил еще один стол и давайте притворимся, что выглядит так.
OtherInfo
|Name | Price |
----------------------------------
|Server01 | 100 |
Я сделал первоначальную копию данных от Matrix до другого INFO. Люди будут добавлять записи в Матрицу, и я хочу, чтобы имя из матрицы перешло в таблицу других.
По сути, поле имени всегда должно повторять то, что находится в матрице. Если что -то изменяется или удаляется на матрице, то же самое должно произойти на других.
Как мне это настроить?
Решение
Создайте следующие четыре (4) триггеры на таблице матрицы
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 ;
Что делает каждый триггер?
matrix_ai
Вставляет новое имя вOtherInfo
после того, как он вставлен вMatrix
matrix_bu
Выполняет проверку, чтобы убедиться, что вы не измените старое имя в новое имя, которое уже существует в таблице Matrixmatrix_au
Обновляет старое имя в других случаях для нового имени, которое вы обновили в Matrixmatrix_ad
Удаляет название из другого, которое вы только что удалили из Matrix
Не связан с dba.stackexchange