我有以下MySQL触发器。它是针对tbl_users的更新而触发的。如果当天已存在记录,它将使用某些信息更新tbl_user_stats,或者如果当天没有记录,它将在tbl_user_stats中插入新记录。 action_date是tbl_user_stats的PK,它保存日期。
drop trigger if exists trigger_update_user_stats_upgrades_and_downgrades$$
CREATE TRIGGER trigger_update_user_stats_upgrades_and_downgrades AFTER UPDATE ON tbl_users
FOR EACH ROW BEGIN
DECLARE date_now int;
IF NEW.premium <> OLD.premium THEN
SET date_now = (SELECT count(*) from tbl_user_stats WHERE DATE(action_date) = CURDATE());
IF date_now > 0 THEN
IF NEW.premium = 0 THEN
UPDATE tbl_user_stats SET downgrades = downgrades + 1 WHERE DATE(action_date) = CURDATE();
ELSE
UPDATE tbl_user_stats SET upgrades = upgrades + 1 WHERE DATE(action_date) = CURDATE();
END IF;
ELSE
IF NEW.premium = 0 THEN
INSERT INTO tbl_user_stats (action_date, downgrades) values (CURDATE() + INTERVAL 1 DAY, 1);
ELSE
INSERT INTO tbl_user_stats (action_date, upgrades) values (CURDATE() + INTERVAL 1 DAY, 1);
END IF;
END IF;
END IF;
END$$
在底部,我插入CURDATE()+ INTERVAL 1天用于测试目的。我正在尝试模拟第二天正在执行的tbl_users的更新。因此,如果今天是11/22/13,我想假装在13/23/13更新tbl_users中的记录。如果触发器正常工作,tbl_user_stats应该插入一个新的记录,其action_date为11/23/13。
问题是,当我尝试更新tbl_users时,出现“Duplicate primary key 11/23/13”的错误。但是,tbl_user_stats中没有主键设置为11/23/13。当我使用11/23/13作为PK手动将新记录插入tbl_user_stats时,没有问题。只有在我尝试更新tbl_users时才会出现此问题。为什么我收到Duplicate主键错误?
答案 0 :(得分:0)
我已经重现了这个错误。
发生这种情况是因为您正在检查“date_now”正在检查CURDATE()
的条件
当您使用CURDATE() + INTERVAL 1 DAY
插入时
要模拟第二天,您应该将所有日期比较更改为CURDATE() + INTERVAL 1 DAY
sqlFiddle code with all CURDATE() changed to CURDATE + INTERVAL 1 DAY摆脱了错误。 要重现错误,只需更改
SET date_now = (SELECT count(*) from t2 WHERE DATE(start_date) = CURDATE()+ INTERVAL 1 DAY);
到
SET date_now = (SELECT count(*) from t2 WHERE DATE(start_date) = CURDATE());`