我正在尝试在执行以下操作的表上创建AFTER INSERT触发器:
这是触发器代码:
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。
答案 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);
(我不清楚触发器的意图,所以我可能会有一些错误。)