Используйте один триггер для вставки в несколько таблиц на основе условия

#mysql #datetime #triggers

Вопрос:

У меня есть таблица с именем three_current. эти таблицы вставляются с 3 новыми строками каждые 1 минуту из другого приложения, поэтому таблицы продолжают увеличиваться в строках. Эти три новые строки всегда имеют номер канала 350, 351 и 352. Я хочу, чтобы триггер вставлял каждую из этих трех строк в три отдельные таблицы, чтобы каждая таблица содержала данные с одинаковым номером канала.

Таблицы three_current как таковые:

таблица трехточечных потоков

дата и время номер канала Ценность Статус
01/06/2021 22:45:00 350 100 1
01/06/2021 22:45:00 351 120 1
01/06/2021 22:45:00 352 110 1
01/06/2021 22:46:00 350 95 1
01/06/2021 22:46:00 351 105 1
01/06/2021 22:46:00 352 150 1
01/06/2021 22:47:00 350 195 1
01/06/2021 22:47:00 351 205 1
01/06/2021 22:47:00 352 250 1

У меня также есть три другие таблицы с именами red_current, yellow_current и blue_current. Я безуспешно пытаюсь создать триггер для обновления этих трех таблиц на основе номера канала таблицы three_current, чтобы

таблица red_current будет

дата и время номер канала Ценность Статус
01/06/2021 22:45:00 350 100 1
01/06/2021 22:46:00 350 95 1
01/06/2021 22:47:00 350 195 1

таблица yellow_current будет

дата и время номер канала Ценность Статус
01/06/2021 22:45:00 351 120 1
01/06/2021 22:46:00 351 105 1
01/06/2021 22:47:00 351 205 1

таблица blue_current будет

дата и время номер канала Ценность Статус
01/06/2021 22:45:00 352 110 1
01/06/2021 22:46:00 352 150 1
01/06/2021 22:47:00 352 250 1

Но что я получаю после выполнения своего кода, так это то, что таблицы red_current, yellow_current и blue_current вставляются со строками, в которых номер канала равен 350. Это означает, что правильна только таблица red_current, в то время как две другие таблицы являются дубликатами таблицы red_current. (Я чувствую, что мой код может выполняться только для первой строки каждого обновления, полученного таблицей three_current, и это строка с номером канала 350).

Мой код выглядит следующим образом:

 DELIMITER //
CREATE TRIGGER `add` AFTER INSERT ON `three_current`
FOR EACH ROW
BEGIN
                 DECLARE new_datetime datetime ;           -- choose the datatypes
                 DECLARE new_channel_number int;           -- 
                 DECLARE new_value double;                 --
                 DECLARE new_status smallint;              --
                
                 SET new_datetime = new.datetime ; 
                 SET new_channel_number = new.channel_number ;
                 SET new_value = new.value ;
                 SET new_status = new.status;
                
INSERT INTO red_current (datetime, channel_number, value, status)
    SELECT new.datetime, new.channel_number , new.value, new.status  
    FROM three_current WHERE channel_number = '350'
    ON DUPLICATE KEY UPDATE status = new.status;      
    
INSERT INTO yellow_current (datetime, channel_number, value, status)
    SELECT new.datetime, new.channel_number , new.value, new.status  
    FROM three_current WHERE channel_number = '351'
    ON DUPLICATE KEY UPDATE status = new.status;  
    
INSERT INTO blue_current (datetime, channel_number, value, status)
    SELECT new.datetime, new.channel_number , new.value, new.status  
    FROM three_current WHERE channel_number = '352'
    ON DUPLICATE KEY UPDATE status = new.status  ;  
END
//
DELIMITER ;

 

Комментарии:

1. MySQL <> SQL Server. Пожалуйста, в будущем избегайте несвязанных тегов.

2. Вы забыли объяснить, с какой проблемой вы сталкиваетесь из-за того, что у вас есть…