我在子表上有一个触发器,用于更新父表上的计数器。无论我是 CREATE TRIGGER ... BEFORE INSERT
还是 AFTER INSERT
,触发器中的 SQL 总是在之后执行。
有没有办法强制它运行之前?
CREATE TABLE items (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
quantity_sold int(11) unsigned DEFAULT 0,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE line_items (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
item_id int(11) unsigned DEFAULT NULL,
quantity int(11) unsigned DEFAULT 1,
PRIMARY KEY (id),
CONSTRAINT fk FOREIGN KEY (item_id) REFERENCES items (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO items (id) VALUES (1);
DROP TRIGGER IF EXISTS line_item_trigger;
delimiter $$
CREATE TRIGGER line_item_trigger BEFORE INSERT ON line_items
FOR EACH ROW
BEGIN
UPDATE items SET quantity_sold = quantity_sold + NEW.quantity WHERE id = NEW.item_id;
END
$$
运行:
INSERT INTO line_items (item_id) VALUES (1);
...结果:
INSERT INTO line_items (item_id) VALUES (1);
UPDATE items SET quantity_sold = quantity_sold + NEW.quantity WHERE id = NEW.item_id;
我希望让 UPDATE
先发生。
(为什么?这一切都是在事务中完成的,INSERT
在进行外键检查时锁定了 items
表,导致到处都是死锁。 )
提前感谢您的任何见解。
最佳答案
CREATE TRIGGER line_item_trigger BEFORE INSERT ON line_items
FOR EACH ROW
此触发器强制在插入之前调用。没有什么比这更需要做的了。
请根据需要检查您的提交频率,以确保您正在提交交易。
关于mysql - 我可以让 MySQL 触发器在实际触发语句之前执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45889880/