【问题标题】:Insert values into a table using a trigger with values from stored procedure使用来自存储过程的值的触发器将值插入表中
【发布时间】:2019-05-01 19:04:34
【问题描述】:

我是这里的新手。所以,如果我的代码或思维方法可以工作,请随时纠正我。

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

ds_testdb2

-表格:

  1. asset_sensor_table

  2. device_table

  3. mapped_readings_table
  4. 读数表
  5. sensor_table

每次在我的 readings_table 中插入记录时,我都需要执行以下 SELECT 语句(插入到 readings_table 中大约每 1 分钟发生一次)。此 SELECT 语句连接 4 个表并生成设备的 imei 与来自另一个名为 agiletest 的数据库的其他设备属性(例如 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)

现在,每次在我的 readings_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 中执行以下步骤:

--Step 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。不允许从触发器返回结果集

--Step 2. 执行触发器
- 已经在 MySQL 命令提示符中运行它
-响应是:查询正常,0 行受影响(0.04 秒)

步骤 3. 检查 mapped_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

【问题讨论】:

  • 你试过用存储函数代替吗?
  • @Uueerdo:还没有。我不熟悉他们。您是否建议编写一个stored_function 来代替stored_procedure,然后使用Trigger 调用该stored_function?
  • 存储函数不能返回结果集; MySQL 可能不允许在触发器中调用 proc,因为 procs 可以返回结果。
  • @Uueerdo:嗯..我仍然不确定如何解决这个查询。你建议我如何处理它?

标签: mysql stored-procedures triggers


【解决方案1】:

解决方法如下: 我上面的触发器完美地工作,并且是完成我想到的工作的正确触发器。问题是我创建了许多虚拟触发器来查看我的触发器是否工作。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多