我有两个表,我想在表 B 上插入或删除新记录时更新计数器记录字段表 A,并且代码相同。
表 A 字段
ID代码计数器等。
表 B 字段
身份证代码等。
当在表B 上插入/删除新记录时,如果它们具有相同的代码字段,我想在表 A 计数器字段上对其进行计数。
我想这可以通过触发器完成,但我需要一些帮助。
我们可能可以使用MySQL触发器来实现。
我们应该考虑不在table_a
上存储计数器的选项,而只是从table_b
中获取计数。
在实现触发器时,我们还需要注意一些问题。这可能会影响性能,对于执行 DML 的触发器,可能会引入锁争用。触发器不是免费的,它们也不是"灵丹妙药"。
我们需要一个AFTER UPDATE
触发器(用于处理更新行以更改code
列值的情况(,以及AFTER INSERT
和AFTER 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
是指 UPDATE 或 DELETE 语句之前列code
中的"旧"值。
<=>
(宇宙飞船操作员(是 NULL 安全比较运算符,返回 TRUE 或 FALSE。不像比较 NULL 值时常规比较运算符那样返回 NULL。
x <=> y
是速记,相当于写( x = y OR ( x IS NULL AND y IS NULL ) )
在 UPDATE 触发器中进行比较的目的是,如果 code
的值没有更改,则无需从该code
值的计数中减去 1,然后立即将 1 加回相同的计数。避免运行不必要的 UPDATE 语句会更有效。