【问题标题】:MYSQL - How to create a trigger after an UPDATE in a table, to increment +1 the value of a column from another table?MYSQL - 如何在表中更新后创建触发器,以增加 +1 另一个表中列的值?
【发布时间】:2021-03-04 22:26:15
【问题描述】:

这些是我的桌子:

我在更新此表后创建触发器:

表格'avisos':

idAvisos | retirado 
---------------------
   1     |    0 
   2     |    1

表'recolectores':

idRecolector | num_avisos_retirados
-----------------------------------
      1      |         0 
      2      |         4

所以我想要做的是,在我更新表 avisos 以将“retirado”设置为 true (1) 后,我想将 +1 加到 recolectores 表的“num_avisos_retirados”列。

示例:当 idAvisos (1) 将“retirado”更改为 1 时,idRecolector (1) 必须将 num_avisos_retirados 更改为 1。

这是我到目前为止所做的:

CREATE TRIGGER NumAvisosRecolectados_AU #after update
AFTER UPDATE ON avisos.retirado
    IF (NEW.retirado = 1) THEN
        UPDATE recolectores
        SET recolectores.num_avisos_recolectados = recolectores.num_avisos_recolectados + 1
    END IF;

另外,我不明白的是,如果我必须使用 WHERE 子句,才能真正命中“recolectores”表的正确 idRecolector。我的老师给了我们一个类似的例子,但是她没有使用 WHERE 子句来检查正确的 ID。它会自动加入正确的表吗?

当我运行那个 sql 语句时,我得到了这个错误:

'IF (NEW.retirado = 1) THEN 附近的语法错误 更新回忆者 SET recolectore' en la linea 3

更新

阅读后:Fire a trigger after the update of specific columns in MySQL

我现在更改了我的语句,因为我不能在 avisos.retirado 上使用 UPDATE,而是必须使用 FOR EACH ROW 和一个 IF 语句来检查特定列的更改。正如@nbk 所建议的那样,我还添加了一个 WHERE 子句来实际点击我想要更新的正确 id

现在是代码:

DELIMITER //
CREATE TRIGGER NumAvisosRecolectados_AU #after update
AFTER UPDATE ON avisos
FOR EACH ROW
BEGIN
    IF (NEW.retirado = 1) THEN
        BEGIN
            UPDATE recolectores
            SET recolectores.num_avisos_recolectados = recolectores.num_avisos_recolectados + 1
            WHERE reservas.FK_IDavisos = avisos.ID_avisos
            AND reservas.FK_IDrecolector = recolectores.ID_recolector
        END
    END IF;
END; //
DELIMITER ;

但我仍然遇到语法错误:

#1064 - 'END 附近的语法错误 如果结束;

【问题讨论】:

  • 您本可以在不到一半的时间内完成测试...
  • @jarlh 我忘了添加错误,我已经测试过了。 “'IF (NEW.retirado = 1) THEN UPDATE recolectores SET recolectores' en la linea 3 附近的语法错误”

标签: mysql sql triggers


【解决方案1】:

您需要一个 `DELIMITER 并且语法已关闭

DELIMITER //
CREATE TRIGGER NumAvisosRecolectados_AU #after update
AFTER UPDATE ON avisos.retirado 
FOR EACH ROW
BEGIN
    IF (NEW.retirado = 1) THEN
        UPDATE recolectores
        SET recolectores.num_avisos_recolectados = recolectores.num_avisos_recolectados + 1
        WHERE idRecolector  = NEW.idAvisos;
    END IF;
END//
DELIMITER ;

新编辑

DELIMITER //
CREATE TRIGGER NumAvisosRecolectados_AU #after update
AFTER UPDATE ON avisos
FOR EACH ROW
BEGIN
    IF (NEW.retirado = 1) THEN

            UPDATE recolectores
            SET recolectores.num_avisos_recolectados = recolectores.num_avisos_recolectados + 1
            WHERE reservas.FK_IDavisos = avisos.ID_avisos
            AND reservas.FK_IDrecolector = recolectores.ID_recolector;
    END IF;
END; //
DELIMITER ;

【讨论】:

  • 1) avisos.retirado 是一列(见示例) 2) 在我将表 avisos 更新为 将“retirado”设置为 true (1) i> - 即OLD.retirado 也必须检查。 3)retirado 检查可以集成到 WHERE - 我们将获得 BEGIN-END 和分隔符重新评估中不需要的单语句触发器。
  • @nbk 我进行了更新,我更改了您建议的一些内容,但我仍然遇到语法错误,我尝试删除“;”然后放回其他地方,但仍然出现错误
  • 我用你的新代码更新了我的答案,看看我改变了什么。每个命令都必须以分号结尾,你不需要另一个 begin 和 e3nd,但是当你使用它们时,结尾也必须有一个分号
【解决方案2】:

这里的触发器是在更新有向表中的列之前:

 DELIMETER $$
    
    CREATE TRIGGER update_trigger BEFORE UPDATE ON your_table_name 
    FOR EACH ROW
    
    BEGIN
    
    IF NEW.value <> 0 THEN 
    
    UPDATE table_name SET col_name = NEW.value WHERE col_id = NEW.id
    
    END IF;
    
    END ;

DELEMITER ;

执行查询,一切都会好起来的,就是这样!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2017-05-17
    相关资源
    最近更新 更多