在mysql中插入时创建触发器,显示错误

omhiaaxx  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(372)

创建表:

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服务器版本相对应的手册,以获得在第80.000行附近使用的正确语法

li9yvcax

li9yvcax1#

触发器中需要更新三件事:
答。需要添加 ; 在你生命的尽头 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

bvhaajcl

bvhaajcl2#

为了简单起见,不需要使用 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)

相关问题