2013-11-21 4 views
0

Я пытаюсь создать этот триггер и получаю сообщение об ошибке для строки UPDATE.MySQL - Что случилось с этим триггером?

DROP TRIGGER IF EXISTS upd_signedup; 

CREATE TRIGGER upd_signedup 
BEFORE INSERT ON tbl_users 
FOR EACH ROW 
BEGIN 
    UPDATE tbl_user_stats SET signups = signups + 1; 
END 

EDIT: Я поставил разделитель $$, но не может создать этот триггер:

drop trigger if exists upd_signedup$$ 

CREATE TRIGGER upd_signedup 
BEFORE INSERT ON tbl_users 
FOR EACH ROW 
BEGIN 
    UPDATE tbl_user_stats SET signups = signups + 1$$ 
END 
+0

С каким MySQL-клиентом вы выполняете это с помощью? Вы изменили разделитель инструкций в зависимости от вашего клиента? –

+0

phpMyAdmin. Я не изменил разделитель. – user2121620

+0

Какое сообщение об ошибке вы получаете? –

ответ

2

Кажется, вы не поняли концепцию использования DELIMITER при определении триггеров.

; (semi colour) - это обычный разделитель, индикатор конца исполняемого оператора. Но когда вы определяете триггер или хранимую процедуру, вы определяете тело с несколькими исполняемыми операторами, такими как объявления переменных и операторы SQL.

Использование ; указывает на механизм SQL, который завершает оператор, и пришло время его скомпилировать и выполнить. Но если тело триггера или хранимая процедура END s, нет смысла выполнять внутренние инструкции тела триггера/sp. Чтобы прекратить обработку таких утверждений, мы используем пользовательский DELIMITER, например // или $$, или что-то, что вам удобно и часто не используется в части тела определения триггера/sp. Затем MySQL понимает, что оператор заканчивается только тогда, когда он находит ваш пользовательский определенный DELIMITER, например, $$ или //.

Пример приведен ниже:

mysql> 
mysql> set @cnt=0; 
Query OK, 0 rows affected (0.00 sec) 

mysql> 
mysql> -- drop trigger if exists trig_bef_del_on_tbl; 
mysql> delimiter // 
mysql> create trigger trig_bef_del_on_tbl before delete on tbl 
    -> for each row begin 
    ->  set @cnt = if(@cnt is null, 1, (@cnt+1)); 
    -> 
    ->  /* for cross checking save loop count */ 
    ->  insert into rows_affected values (@cnt); 
    -> end; 
    -> // 
Query OK, 0 rows affected (0.00 sec) 

mysql> 
mysql> delimiter ; 
mysql> 
mysql> -- now let us test the delete operation 
mysql> delete from tbl where i like '%1%'; 
Query OK, 3 rows affected (0.02 sec) 

См:

+0

Благодарим вас за это. – user2121620

0

тело триггера имеет только один команду, так что вы может использовать этот простой синтаксис без предложения BEGIN-END и без DELIMITER:

CREATE TRIGGER upd_signedup 
    BEFORE INSERT ON tbl_users 
    FOR EACH ROW 
    UPDATE tbl_user_stats SET signups = signups + 1; 
+0

Если я хочу, в конце концов, добавить инструкцию SELECT перед оператором UPDATE, мне понадобится предложение BEGIN-END? – user2121620

+0

Да, вам нужно добавить это предложение. Обратите внимание, что операторы SELECT и UPDATE можно объединить в один общий оператор UPDATE. – Devart

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