MySQL触发条件逻辑具有意外行为

时间:2014-10-13 15:57:37

标签: mysql triggers

我在使用MySQL触发器时​​遇到问题,以便在用户添加或删除项目时保留项目数。我们有两个基本表,包括以下列:

的user_data

  • user_id - UNSIGNED INT(11) PRIMARY KEY AI
  • item_count - UNSIGNED INT(11)

item_data

  • item_id - UNSIGNED INT(11) PRIMARY KEY AI
  • user_id - UNSIGNED INT(11) FK(user_data.user_id)
  • version_id - UNSIGNED INT(11)
  • type - VARCHAR(32)
  • 有效 - TINYINT

上面的表格中有更多列,但它们与问题无关。 UPDATEINSERT个事件user_data.item_count应相应更新。因此,我有以下触发设置

插入触发器如下所示:

CREATE TRIGGER insertItem 
AFTER INSERT ON `item_data`
FOR EACH ROW
BEGIN
    IF( NEW.`type` = 'inStock') THEN
        UPDATE `user_data`
        SET `item_count` = `item_count` + 1
        WHERE `user_id` = NEW.`user_id`;
    END IF;
END;

更新触发器如下所示:

CREATE TRIGGER updateItem 
AFTER UPDATE ON `item_data`
FOR EACH ROW
BEGIN
    IF (NEW.`type` = 'inStock') THEN
        IF OLD.`active` = 1 AND NEW.`active` = 0 THEN
            SET @change = -1;
        ELSEIF OLD.`active` = 0 AND NEW.`active` = 1 THEN
            SET @change = 1;
        END IF;
        IF @change IS NOT NULL THEN
            UPDATE `user_data`
            SET `item_count` = `item_count` + @change
            WHERE `user_id` = NEW.`user_id`;
        END IF;
    END IF;
END;

当我运行维护脚本来更新看似与触发器无关的参数时,会出现问题。我收到错误:

SQLSTATE[22003]: Numeric value out of range: 
1690 BIGINT UNSIGNED value is out of range in
'(`user_data`.`item_count` + (@`change`))' 
(SQL: update `item_data` set `version_id` = 397928 where `item_id` = 159186)

如果user_data.item_count = 0项目发生负面变化,则会出现这种情况, 但是如果根据我的触发器的定义,如何简单地更新version_id触发此更改,为什么更改为负?

1 个答案:

答案 0 :(得分:1)

@change保留活动会话中的值,您必须在触发开始时重置该值:

...
BEGIN
    SET @change = null;

...