2013-11-26 62 views
0

我在我的mysql數據庫中添加了一個觸發器,但是當它被使用時它不會終止。我究竟做錯了什麼?
我的查詢,添加觸發器:mysql不終止觸發器

DROP TRIGGER IF EXISTS insertResVals; 
DELIMITER $$ 
create trigger insertResVals 
AFTER INSERT 
ON lastAccess 
     for each row begin 
       DECLARE done INT; 
       DECLARE res varchar(50); 
       DECLARE val double; 
       DECLARE sig VARCHAR(140); 
       DECLARE cur1 CURSOR FOR SELECT resource, value FROM resourceDefault; 
       DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 
       OPEN cur1; 
       SET done = 0; 
       read_loop: LOOP 
         FETCH cur1 INTO res, val; 
         IF NOT done THEN 
           LEAVE read_loop; 
         END IF; 
         insert into log 
         select concat(NEW.playerID, ", ", res, ", ", val); 

         if res<>null and val<>null THEN 
           INSERT INTO resourceValue VALUES(NEW.playerID, res, val); 
         ELSE 
           set done = 1; 
         END IF; 
       END LOOP; 

       CLOSE cur1; 
     END $$ 
DELIMITER ; 

非常感謝您 我試圖調試,但插入到日誌表沒有工作(我猜是因爲該交易沒有完成)。

+0

你能用簡單的語言解釋你想用這個觸發器實現什麼邏輯嗎? – peterm

+0

當添加一個新用戶時(通過添加到lastAccess),應該從第二個表(resourceDefault)中檢索默認值並將其添加到resourceValue –

回答

0

的問題必須在下面的代碼行:

... 
if res<>null and val<>null THEN 
... 

,因爲這將始終爲NULL,並評估爲FALSE。

更改12.3.2. Comparison Functions and Operators<>通過IS NOT NULL

... 
IF res IS NOT NULL AND val IS NOT NULL THEN 
... 

UPDATE

下觸發工作沒有問題:

/* CODE FOR DEMONSTRATION PURPOSES */ 

/* Trigger structure for table `lastaccess` */ 

DROP TRIGGER IF EXISTS `insertResVals`; 

DELIMITER $$ 

CREATE TRIGGER `insertResVals` AFTER INSERT ON `lastaccess` 
FOR EACH ROW 
BEGIN 
    DECLARE done INT default 0; 
    DECLARE res varchar(50); 
    DECLARE val double; 
    DECLARE sig VARCHAR(140); 
    DECLARE cur1 CURSOR FOR SELECT resource, value FROM resourcedefault; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 
    OPEN cur1; 
    SET done = 0; 
    read_loop: LOOP 
     FETCH cur1 INTO res, val; 
     IF done THEN 
      LEAVE read_loop; 
     END IF; 
     insert into log 
     select concat(NEW.playerid, ", ", res, ", ", val); 
     if res IS NOT null and val IS NOT null THEN 
      INSERT INTO resourcevalue VALUES(NEW.playerid, res, val); 
     ELSE 
      set done = 1; 
     END IF; 
    END LOOP; 
    CLOSE cur1; 
END$$ 

DELIMITER ; 

SQL Fiddle demo

+0

我試過,但是當我插入到「lastAccess」表它從來沒有finnishes –

+0

@PeterBurkert:看到更新的答案。 – wchiquito

+0

謝謝你的回答,但'lastaccess'不是sam作爲lastAccess,所以觸發器被接受,但不用於表lastAccess。 –