使用触发器和存储过程中的值将值插入表中

时间:2019-05-01 19:04:34

标签: mysql stored-procedures triggers

我是这里的新手。因此,如果可以使用我的代码或思维方法,请随时纠正我。

我正在使用MySQL Workbench和MySQL 8.0命令行客户端。我有一个名为 ds_testdb2 的数据库及其表 结构如下:

ds_testdb2

-表格:

  1. asset_sensor_table

  2. device_table

  3. mapped_readings_table
  4. readings_table
  5. sensor_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

1 个答案:

答案 0 :(得分:0)

这是解决方案: 我上面的触发器非常有效,并且是完成我所想到的工作的正确触发器。问题是我创建了许多虚拟触发器,以查看触发器是否正常工作。

因此,在readings_table上插入后,将执行这些旧的虚拟触发器,而不是最后一个。一旦删除了旧的触发器,并且系统中只有正确的触发器,问题就解决了。