当新记录插入另一个表MYSQL

时间:2018-05-01 18:28:47

标签: mysql mysqli

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

表A字段

ID-CODE-COUNTER-等

表B字段

ID-CODE-等

当在表B上插入/删除新记录时,如果它们具有相同的CODE字段,我想在表A COUNTER FIELD上计数。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

我们可以使用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指的是&#34; new&#34; INSERT或UPDATE语句分配给列code的值。

OLD.code指的是&#34; old&#34;在UPDATE或DELETE语句之前的列code中的值。

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

x <=> y是写作( x = y OR ( x IS NULL AND y IS NULL ) )

的简称

在UPDATE触发器中进行比较的目的是,如果code的值没有改变,则无需经历从计数中减去1的严格要求code值,然后立即将1添加回同一计数。为避免运行不必要的UPDATE语句,效率更高。