我是这里的新手。因此,如果可以使用我的代码或思维方法,请随时纠正我。
我正在使用MySQL Workbench和MySQL 8.0命令行客户端。我有一个名为 ds_testdb2 的数据库及其表 结构如下:
ds_testdb2
-表格:
asset_sensor_table
device_table
每次在 readings_table 中插入一条记录时,我都需要执行以下SELECT语句(大约每1分钟插入一次readings_table)。该SELECT语句连接4个表,并从另一个名为 agiletest 的数据库中生成设备的imei与其他设备属性(例如device_id,subscription_id等)的映射。此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)
现在,每次在我的reads_table中插入一条记录时,都需要执行此SP。因此,我创建了一个触发器,说:
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条记录插入到读数表中
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步。检查map_readings_table是否已更新(当前#rows = 16)
select * from mapped_readings_table;
-仍然停留在步骤1的错误中。
我的问题是:在第1步中,每次将记录插入到 readings_table中时,如何重写触发器以使-存储过程的结果集存储在 mapped_readings_table 中?而且,我的步骤(步骤1,2,3)是否正确,可以验证触发器的执行情况?
类似的问题在这里:Update table in a trigger with values from stored procedure
答案 0 :(得分:0)
这是解决方案: 我上面的触发器非常有效,并且是完成我所想到的工作的正确触发器。问题是我创建了许多虚拟触发器,以查看触发器是否正常工作。
因此,在readings_table上插入后,将执行这些旧的虚拟触发器,而不是最后一个。一旦删除了旧的触发器,并且系统中只有正确的触发器,问题就解决了。