繁体   English   中英

当新记录插入另一个表时更新计数器字段

[英]Update counter field when a new record inserted on another table

我有两个表,我想在表 B 上插入或删除新记录并且代码相同时更新计数器记录字段表 A。

表 A 字段

ID-CODE-COUNTER-等..

表 B 字段

ID-CODE-等..

当在表 BI 上插入/删除的新记录想要在表 A 计数器字段上对其进行计数时,如果它们具有相同的 CODE 字段。

我想这可以用触发器来完成,但我需要一些帮助。

我们可能可以使用 MySQL 触发器来实现。

我们应该考虑不在table_a上存储计数器的选项,而只是从table_b获取计数。

在实施触发器时,我们还需要注意一些问题。 存在潜在的性能影响,对于执行 DML 的触发器,可能会引入锁争用。 触发器不是免费的,也不是“灵丹妙药”。

我们需要一个AFTER UPDATE触发器(处理更新行以更改code列值的情况),以及AFTER INSERTAFTER DELETE触发器。

我们想要一个合适的索引在 table_b 上可用,例如

 ON table_a (code)

假设 table_a counter列不是 NULL,并且该counter被初始化为我们期望的值。

作为第一次剪辑:

-- 删除后

DELIMITER $$

CREATE TRIGGER table_b_ad
AFTER DELETE ON table_b
FOR EACH ROW
BEGIN
    -- decrement counter on row of table_a with matching OLD code
    UPDATE table_a a
       SET a.counter = a.counter - 1
     WHERE a.code <=> OLD.code
    ;
END$$

DELIMITER ;

-- 插入后

DELIMITER $$

CREATE TRIGGER table_b_ai
AFTER INSERT ON table_b
FOR EACH ROW
BEGIN
    -- increment counter on row of table_a with matching NEW code
    UPDATE table_a a
       SET a.counter = a.counter + 1
     WHERE a.code <=> NEW.code
    ;
END$$

DELIMITER ;

-- 更新后

DELIMITER $$

CREATE TRIGGER table_b_au
AFTER UPDATE ON table_b
FOR EACH ROW
BEGIN
    IF NOT ( NEW.code <=> OLD.code ) THEN
       -- decrement counter on row of table_a that matches OLD code
       UPDATE table_a a
          SET a.counter = a.counter - 1
        WHERE a.code <=> OLD.code
       ;
       -- increment counter on row of table_a that matches NEW code
       UPDATE table_a a
          SET a.counter = a.counter + 1
        WHERE a.code <=> NEW.code
       ;
    END IF; 
END$$

DELIMITER ;

笔记:

在 MySQL 触发器中,

NEW.code指的是通过 INSERT 或 UPDATE 语句分配给列code的“新”值。

OLD.code是指在列中的“旧”值code一个UPDATE或DELETE语句之前。

<=> (飞船运算符)是 NULL 安全的比较运算符,返回 TRUE 或 FALSE。 在比较 NULL 值时,不会像常规比较运算符那样返回 NULL。

x <=> y是相当于写作的简写( x = y OR ( x IS NULL AND y IS NULL ) )

在 UPDATE 触发器中进行比较的目的是,如果code的值没有改变,则无需通过从该code值的计数中减去 1,然后立即将 1 加回到相同的繁琐数数。 避免运行不必要的 UPDATE 语句会更有效率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM