Как настроить триггеры в MySQL для копирования поля

dba.stackexchange https://dba.stackexchange.com/questions/9678

  •  16-10-2019
  •  | 
  •  

Вопрос

У меня есть собственное приложение, которое я собрал вместе, и я очень новичок в 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 Выполняет проверку, чтобы убедиться, что вы не измените старое имя в новое имя, которое уже существует в таблице Matrix
  • matrix_au Обновляет старое имя в других случаях для нового имени, которое вы обновили в Matrix
  • matrix_ad Удаляет название из другого, которое вы только что удалили из Matrix
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top