Для простоты не нужно использовать блок begin..end
или DELIMITER
для одного оператора.
Кстати, вы, похоже, путаетесь между MSSQL
(где вы можете использовать dateadd()
функцию и GO
для окончания блоков) и MySQL
, в котором date_add()
используется в другом порядкеи стиль аргументов как (birth_date, interval 1 year)
, использование как date_add(year,1,birth_date)
приводит к ERROR-1064
.
Предотвращение получения ERROR-1442
, используйте триггер BEFORE INSERT
в качестве приведенного ниже формата с префиксом new.
:
mysql> DROP TRIGGER tri_Test_Insert_Trigger;
mysql> CREATE TRIGGER tri_Test_Insert_Trigger
-> AFTER INSERT
-> ON persons
-> FOR Each row
-> UPDATE persons
-> SET review_date = date_add(birth_date, interval 1 year);
Query OK, 0 rows affected (0.17 sec)
mysql> insert into persons(lastname,birth_date) values('Özhan',date'2018-05-15');
ERROR 1442 (HY000): Cant update table 'persons' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
mysql> DROP TRIGGER tri_Test_Insert_Trigger;
Query OK, 0 rows affected (0.17 sec)
mysql> CREATE TRIGGER tri_Test_Insert_Trigger
-> BEFORE INSERT
-> ON persons
-> FOR Each row
-> SET new.review_date = date_add(new.birth_date, interval 1 year);
Query OK, 0 rows affected (0.13 sec)
mysql> insert into persons(lastname,birth_date) values('Özhan',date'2018-05-15');
Query OK, 1 row affected (0.09 sec)
mysql> select * from persons;
+----+----------+-----------+------------+-------------+
| ID | LastName | FirstName | Birth_Date | Review_Date |
+----+----------+-----------+------------+-------------+
| 2 | Özhan | NULL | 2018-05-15 | 2019-05-15 |
+----+----------+-----------+------------+-------------+
1 row in set (0.00 sec)