【问题标题】:Creating Trigger during INSERT in MYSQL showing Error在 MYSQL 中插入期间创建触发器显示错误
【发布时间】:2018-09-29 08:04:47
【问题描述】:

创建表:

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 服务器版本相对应的手册 在第 8 行的 'END GO' 附近使用的语法 0.000 秒

【问题讨论】:

  • 编辑您的问题并添加错误消息的全文
  • 您在UPDATE 查询末尾和END 之后缺少;
  • 看来您使用的是 MSSQL,不是吗..?
  • 在开始和结束之间尝试这段代码:UPDATE Persons SET Review_Date = DATEADD(year,1,Birth_Date);
  • mysql中没有GO

标签: mysql sql triggers database-trigger


【解决方案1】:

触发器中需要更新三件事:

一个。需要在UPDATE sql 的末尾添加;
湾。在触发器末尾删除 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

【讨论】:

  • 我使用了这段代码并创建了触发器。但是当我将数据插入表时,我收到错误“dateadd 不存在”,所以我尝试使用 date_add.Error Code: 1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 '1,birth_date) 附近使用的正确语法; END' 在第 7 行 0.000 秒
【解决方案2】:

为简单起见,无需为一个语句使用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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多