Кажется, вы не поняли концепцию использования 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)
См:
С каким MySQL-клиентом вы выполняете это с помощью? Вы изменили разделитель инструкций в зависимости от вашего клиента? –
phpMyAdmin. Я не изменил разделитель. – user2121620
Какое сообщение об ошибке вы получаете? –