Создание триггера во время INSERT в MYSQL с ошибкой - PullRequest
0 голосов
/ 29 сентября 2018

Создать таблицу:

CREATE TABLE Persons (
    ID int NOT NULL AUTO_INCREMENT,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Birth_Date date,
    Review_Date date,
    PRIMARY KEY (ID)
);

При вставке данных в эту таблицу я хочу добавить триггер, который обновит столбец Review_Date со значением 1 год от даты рождения.Ниже приведен триггер, который я написал, и он показывает ошибку.

CREATE TRIGGER tri_Test_Insert_Trigger 
AFTER INSERT 
ON persons
FOR Each row
BEGIN
    UPDATE persons
    SET review_date = dateadd(year,1,birth_date)
END
GO 

Код ошибки: 1064. У вас ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с 'END GO' в строке 8 0,000 сек

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Для простоты не нужно использовать блок 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)
0 голосов
/ 29 сентября 2018

В триггере необходимо обновить три вещи:

a.нужно добавить ; в конце вашего UPDATE sql
b.удалите GO в конце вашего триггера и используйте DELIMITER вместо
c.dateadd необходимо изменить на date_add

 DELIMITER $$
    CREATE TRIGGER tri_Test_Insert_Trigger 
    AFTER INSERT 
    ON persons
    FOR Each row
    BEGIN
        UPDATE persons
        SET review_date = date_add(year,1,birth_date); -- add ; here
    END$$
  DELIMITER ; -- remove GO and use DELIMITER instead
...