mysql - 我可以让 MySQL 触发器在实际触发语句之前执行吗?

标签 mysql sql

我在子表上有一个触发器,用于更新父表上的计数器。无论我是 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/

相关文章:

php - 基于某种条件的插入(Mysql)

sql - 返回由 plpgsql 函数插入的记录

mysql - 获取每个日期的最高值

mysql - 无法使用Spring data JPA提取mysql的json列

mysql - 联结表是否应该具有来自另一个标识表的多个主键?

Java CallableStatement registerOutParameter,它有什么作用?

MySQL如何构建Where Clause

php - 在 PHP 中设计一个通用的数据库接口(interface)

php - 如何加入带有条款一个查询的帖子?

sql - 使用 SQL 计算库存在某个地点的天数