【问题标题】:DROP and CREATE the same trigger in the same sintaxisDROP 和 CREATE 在同一个 sintaxis 中的同一个触发器
【发布时间】:2014-08-18 17:13:14
【问题描述】:

虚拟问题:在 MySQL 中有下一个代码,但是在 HeidiSQL 中运行它时,在“// CREATE TRIGGER”附近显示一个 sintaxis 错误。我不确定是否会发生这种情况,因为触发器不存在。这是代码:

DROP TRIGGER IF EXISTS oportunidades_movimiento_entregado //
CREATE TRIGGER oportunidades_movimiento_entregado;
AFTER INSERT ON historial_entregado
FOR EACH ROW BEGIN
UPDATE oportunidades
SET oportunidades.fechaModificado = NEW.fecha_creacion
WHERE NEW.oportunidad_id = oportunidades.id;
END//

更新

DELIMITER $$
DROP TRIGGER IF EXISTS oportunidades_movimiento_entregado $$
CREATE TRIGGER oportunidades_movimiento_entregado
AFTER INSERT ON historial_entregado
FOR EACH ROW BEGIN
UPDATE oportunidades
SET oportunidades.fechaModificado = NEW.fecha_creacion
WHERE NEW.oportunidad_id = oportunidades.id;
END; $$
DELIMITER //

这可行,但现在我怀疑...所有代码(DROP 和 CREATE)每次都会运行,还是只运行 CREATE?我需要这个,因为我正在使用 2 个表,在其中一个表中插入/更新数据,然后使用触发器在另一个表中插入一些列以保持历史记录,但是当我在其中进行 INSERT 或 UPDATE 查询时第一张表,MySQL显示错误#1442

无法更新存储/函数触发器中的表 oportunidades,因为它已被调用此存储函数/触发器的语句使用。

【问题讨论】:

    标签: php mysql triggers heidisql


    【解决方案1】:

    要使其正常工作,请先设置分隔符,然后在 CREATE TRIGGER 语句之后将其重置。 删除 CREATE TRIGGER 行末尾的分号。

    这应该可行:

    DELIMITER //
    DROP TRIGGER IF EXISTS oportunidades_movimiento_entregado //
    
    CREATE TRIGGER oportunidades_movimiento_entregado    -- no trailing semicolon here
        AFTER INSERT ON historial_entregado
        FOR EACH ROW BEGIN
            UPDATE oportunidades
            SET oportunidades.fechaModificado = NEW.fecha_creacion
            WHERE NEW.oportunidad_id = oportunidades.id;
        END//
    
    DELIMITER ;
    

    【讨论】:

    • SQL 语法错误...在第 1 行的“DELIMITER”附近使用:(
    猜你喜欢
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多