MySQL - 触发触发时重复PK,但直接插入记录时不重复

时间:2013-11-22 18:36:30

标签: mysql sql database triggers

我有以下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主键错误?

1 个答案:

答案 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());`