2013-11-26 5 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" таблица никогда не финиширует –

+0

@PeterBurkert: См. обновленный ответ. – wchiquito

+0

Благодарим вас за ответ, но 'lastaccess' не является sam как lastAccess, поэтому триггер принят, но не используется для таблицы lastAccess. –

Смежные вопросы