Я новичок здесь. Поэтому, пожалуйста, не стесняйтесь исправлять меня, если мой код или подход к мышлению могут быть обработаны.
Я работаю в MySQL Workbench и клиенте командной строки MySQL 8.0. У меня есть база данных под названием ds_testdb2 с ее таблицами
структурирована следующим образом:
ds_testdb2
-Tables:
asset_sensor_table
device_table
- mapped_readings_table
- readings_table
- sensor_table
Мне нужно выполнять следующую инструкцию SELECT каждый раз, когда в мою readings_table вставляется запись (вставка в readings_table происходит примерно раз в 1 минуту). Этот оператор SELECT объединяет 4 таблицы и создает отображение imei устройства с другими атрибутами устройства, такими как device_id, subscription_id и т. Д., Из другой базы данных с именем agiletest . Этот оператор SELECT работает правильно.
SELECT r.imei, r.send_time, r.latitude, r.longitude, r.temperature, r.ground_velocity,
d.sys_id AS device_id, d.model_id, d.Subscription_ID,
s.id AS sensor_id, s.type_id AS sensor_type,
a_s.asset_id, a_s.start_time, a_s.end_time
FROM
ds_testdb2.readings_table r JOIN agiletest.device d ON r.imei= d.imei
JOIN agiletest.sensor s ON d.sys_id= s.device_id
JOIN agiletest.asset_sensor a_s ON s.id= a_s.sensor_id;
Итак, я поместил этот оператор SELECT в хранимую процедуру. Этот SP также работает правильно.
DELIMITER $$
CREATE PROCEDURE `ds_testdb2`.`mapping_2`()
BEGIN
INSERT INTO `ds_testdb2`.`mapped_readings_table` -- mapped_readings-table already existed, but was empty.
(`imei`, `send_time`, `latitude`, `longitude`,`temperature`,`ground_velocity`,
`device_id`,`model_id`,`subscription_id`,
`sensor_id`,`sensor_type`,
`asset_id`,`start_time`,`end_time`) -- no 'VALUES' keyword
SELECT r.imei, r.send_time, r.latitude, r.longitude, r.temperature, r.ground_velocity,
d.sys_id AS device_id, d.model_id, d.Subscription_ID,
s.id AS sensor_id, s.type_id AS sensor_type,
a_s.asset_id, a_s.start_time, a_s.end_time
FROM
ds_testdb2.readings_table r JOIN agiletest.device d ON r.imei= d.imei
JOIN agiletest.sensor s ON d.sys_id= s.device_id
JOIN agiletest.asset_sensor a_s ON s.id= a_s.sensor_id;
END $$
Затем я запускаю хранимую процедуру:
mysql> call mapping_2;
Query OK, 4 rows affected (0.02 sec)
Теперь этот SP должен выполняться каждый раз, когда запись вставляется в мою readings_table. Итак, я создал триггер, который говорит:
mysql> DELIMITER $$
mysql> CREATE TRIGGER initial_table_mapping_1 AFTER INSERT ON readings_table
-> FOR EACH ROW
-> BEGIN
-> call mapping_2();
-> END $$
Query OK, 0 rows affected (0.04 sec)
Теперь, чтобы проверить выполнение триггера, я делаю следующие шаги в MySQLWorkbench:
- Шаг 1. Вставьте 1 запись в readings_table
INSERT INTO readings_table -- (imei,send_time, latitude, longitude, temperature, ground_velocity)
VALUES
(354721090118251, '2019-04-07 21:26:48',43.63218, -79.51890, 108, 50);
Код ошибки: 1415. Не разрешено возвращать набор результатов из триггера.
- шаг 2. выполнить триггер
- уже запустил его в командной строке MySQL
-Ответ был: запрос в порядке, затронуто 0 строк (0,04 сек)
Шаг 3. проверить, обновлена ли таблица mapped_readings_table (текущая # строка = 16)
select * from mapped_readings_table;
- все еще застрял с ошибкой из шага 1.
У меня такой вопрос: на шаге 1 как я могу переписать свой триггер так, чтобы набор результатов из моей хранимой процедуры сохранялся в моей mapped_readings_table , каждый раз, когда запись вставлялась в мою readings_table ? И, мои шаги (Шаг 1,2,3), чтобы проверить выполнение моего триггера, правильно?
Аналогичный вопрос здесь: Обновление таблицы в триггере со значениями из хранимой процедуры