2013-11-22 68 views
0

我有以下MySQL觸發器。它在tbl_users上被更新。如果當天已經存在記錄,它將使用一些信息更新tbl_user_stats,或者如果當天沒有記錄,它將在tbl_user_stats中插入新記錄。 action_date是tbl_user_stats的PK,它保存日期。MySQL - 當觸發器被觸發時重複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,我想假裝tbl_users中的記錄在11/23/13更新。如果觸發器工作正常,tbl_user_stats應該有一個插入了11/23/13的action_date的新記錄。

問題是,當我嘗試更新tbl_users時,出現「重複主鍵11/23/13」錯誤。但是,tbl_user_stats中沒有設置爲11/23/13的主鍵。當我使用11/23/13作爲PK手動插入一條新記錄到tbl_user_stats中時,沒有任何問題。只有當我嘗試更新tbl_users時纔會出現問題。爲什麼我得到重複主鍵錯誤?

+1

你可以發佈你的表結構的一些數據和導致錯誤的'UPDATE'聲明? – wchiquito

回答

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