触发器中的光标是获取空值(二进制ID)

时间:2017-10-05 12:10:09

标签: database triggers mariadb

我正在尝试在执行以下操作的表上创建AFTER INSERT触发器:

  1. 根据简单的约束条件获取“用户”的光标。
  2. 遍历游标项目并使用获取的ID插入或更新“last_syncs”。
  3. 这是触发器代码:

    CREATE DEFINER=`root`@`localhost` TRIGGER `court_groups_update_last_syncs_on_insert`
    AFTER INSERT ON `court_groups` FOR EACH ROW 
    BEGIN
       DECLARE done INT DEFAULT FALSE;
       DECLARE val INT;
       DECLARE cur CURSOR FOR SELECT users.id FROM users where users.country_id = NEW.country_id;
       DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
    
       OPEN cur;
       cur_loop: LOOP
          IF done THEN
             LEAVE cur_loop;
          END IF;
       FETCH cur INTO val;
       INSERT INTO last_syncs (user_id, table_name) VALUES (val,'court_groups') ON DUPLICATE KEY UPDATE last_syncs.timestamp = NOW();
       END LOOP;
       CLOSE cur; 
    END
    

    问题是游标正在获取NULL值。

    我已经检查了同一问题的先前答案,并且大多数人说有两个同名的变量可能会导致问题,但我的代码中没有这样的内容。

    请记住,数据库中的所有ID都是二进制形式,这可能是问题吗?

    我正在使用MariaDB 10.1.13。

1 个答案:

答案 0 :(得分:0)

如果可以避免使用游标,请不要使用游标。

整个Trigger可以简化为一个语句,如:

INSERT INTO last_syncs (user_id, table_name, timestamp)
    SELECT id, 'court_groups', NOW()
        FROM users
        where country_id = NEW.country_id
    ON DUPLICATE KEY UPDATE timestamp = VALUES(timestamp);

(我不清楚触发器的意图,所以我可能会有一些错误。)