我在使用MySQL触发器时遇到问题,以便在用户添加或删除项目时保留项目数。我们有两个基本表,包括以下列:
的user_data
UNSIGNED
INT(11)
PRIMARY KEY
AI
UNSIGNED
INT(11)
item_data
UNSIGNED
INT(11)
PRIMARY KEY
AI
UNSIGNED
INT(11)
FK(user_data.user_id)
UNSIGNED
INT(11)
VARCHAR(32)
TINYINT
上面的表格中有更多列,但它们与问题无关。 UPDATE
和INSERT
个事件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
触发此更改,为什么更改为负?
答案 0 :(得分:1)
@change
保留活动会话中的值,您必须在触发开始时重置该值:
...
BEGIN
SET @change = null;
...