2017-10-05 54 views
0

我想上,做一個表中創建一個AFTER INSERT觸發器如下:光標在觸發取空值(二進制標識)

  1. 獲得光標的「用戶」基於一個簡單的地方約束。
  2. 迭代光標項並使用提取的ID插入或更新「last_syncs」。

這裏的觸發代碼:

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

你是否真的需要一個光標?你可以發佈'用戶'表結構嗎? – wchiquito

回答

0

如果可以避免使用遊標,請勿使用遊標。

整個觸發器可以簡化爲一個語句,像:

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

(我不清楚觸發的意圖,所以我可能有一些錯誤)

+0

我不得不將ON DUPLICATE語句移動到最後,但它起作用!非常感謝,像魅力一樣工作。 –

+0

糟糕。我編輯了我的答案。 –