MySQL TRIGGER ON INSERT 问题

标签 mysql triggers

我对 MySQL 触发器感到抓狂。 MySQL 说代码中有错误,但我不知道问题出在哪里。

这是触发器

CREATE TRIGGER UPDATE_COUNTRY

AFTER INSERT 

    ON `dog`FOR EACH ROW

BEGIN

IF (NEW.export=1)
THEN
    IF (NEW.year > (SELECT MAX(`updated_year`) FROM `dog`  WHERE `code`=NEW.origin))
THEN 
UPDATE `dog` SET `updated_year`= NEW.year, `updated_month`= NEW.month WHERE `code`= NEW.origin;

ELSEIF (NEW.year = (SELECT MAX(`updated_year`) FROM `dog` WHERE `code`=NEW.origine)
        AND NEW.month > (SELECT MAX(`updated_month`) FROM `dog` WHERE `code`=NEW.origine AND `updated_year`=NEW.year))
    THEN UPDATE `dog` SET `updated_month`=NEW.month  WHERE `code`=NEW.origin;
ELSE
        RETURN NEW;
    END IF;

END IF;
RETURN NEW;
END;

我的 SQL 说

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 13 行 '' 附近使用的正确语法

谢谢大家!

最佳答案

您的触发器是:

AFTER INSERT ON `dog`FOR EACH ROW

你的第 13 行是

UPDATE `dog` SET `updated_year`= NEW.year, `updated_month`= NEW.month WHERE `code`= NEW.origin;

这有点糟糕,但是您无法在当前插入/更新/删除数据的同一个表上使用触发器进行更新/插入/删除,因为该表已锁定。

这是 MySQL 的限制(是的,并不是所有 SGDB 实际上都有这个限制......(

如果您想更新“dog”表,则需要采用不同的方法。您可以使用存储过程来执行插入和更新。

关于MySQL TRIGGER ON INSERT 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32785219/

相关文章:

mysql - 使用mysql中的触发器生成字母数字员工ID?

mysql - 如何避免 GORM 中的竞争条件

php - 初学者 php mysql - 从输入表单将数据插入到表中

mysql - 如何在mySql中获取用户未申请的所有作业

mysql - 如何使用子查询?

error-handling - 触发后引发错误的问题

MySQL IF 触发错误

php - joshcam php $db->有函数

sql - 在触发器函数中,如何获取正在更新的字段

triggers - MDR 澄清