【问题标题】:How to update rows in table in after delete trigger如何在删除触发器后更新表中的行
【发布时间】:2015-02-01 20:40:29
【问题描述】:

我有一张表 country_group

+------+----------+--------+
| code | group_id | weight |
+------+----------+--------+
| me   | 1        | 50.00  |
+------+----------+--------+
| me   | 2        | 10.00  |
+------+----------+--------+
| me   | 3        | 40.00  |
+------+----------+--------+

对我来说,对于每个国家/地区,列权重的总和为 100 非常重要。我在这里要做的是,当我删除其中一行时,我需要更改该国家/地区的权重值,以便所有权重的总和为那个国家仍然是 100。我想在我的数据库中为此设置触发器。

例如,如果我删除权重为 10.00 的行,则表格应如下所示:

+------+----------+--------+
| code | group_id | weight |
+------+----------+--------+
| me   | 1        | 55.00  |
+------+----------+--------+
| me   | 3        | 45.00  |
+------+----------+--------+

所以这是我的触发器:

CREATE DEFINER = CURRENT_USER TRIGGER   extensionui2.country_group_AFTER_DELETE 
AFTER DELETE ON country_group 
FOR EACH ROW
BEGIN
    DECLARE w FLOAT(5,2);
    DECLARE c INT;
    DECLARE s FLOAT(5,2);

    SET w = OLD.weight;
    SELECT count(*) into c FROM country_group WHERE code = OLD.code;

    SET s = w / c;
    UPDATE country_group SET weight = weight + s WHERE code = OLD.code;
END;

但我收到此错误:

Operation failed: There was an error while applying the SQL script to the database.
Executing:
DELETE FROM `extensionui2`.`country_group` WHERE `code`='ms' and`group_id`='9';

ERROR 1442: 1442: Can't update table 'country_group' in stored  function/trigger because it is already used by statement which invoked this stored function/trigger.
SQL Statement:
DELETE FROM `extensionui2`.`country_group` WHERE `code`='ms' and`group_id`='9'

我需要在触发代码中进行哪些更改才能使其正常工作?

【问题讨论】:

    标签: mysql triggers sql-update sql-delete


    【解决方案1】:

    MySQL ERROR 1442 是由于 MySQL 中的限制。不允许触发器更新定义触发器的表中的任何行。

    存储的函数或触发器不能修改已被调用函数或触发器的语句使用(用于读取或写入)的表。

    因此,不可能在触发器的上下文中执行您尝试执行的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      相关资源
      最近更新 更多