在mysql中,我有一个触发器来检查冲突,并更新发生冲突的行的hp值。我还将射弹的布尔值设置为true表示稍后应将其删除。但我似乎做了两次,我宁愿做一次。
DELIMITER //
CREATE TRIGGER checkcollision2 BEFORE UPDATE ON projectiles
FOR EACH ROW
BEGIN
SET @unit_size:=25;
IF (SELECT count(*) FROM players WHERE wolf=1 AND NEW.x>=x AND NEW.x<=x+@unit_size AND NEW.y>=y AND NEW.y<=y+@unit_size)>0 THEN
SET NEW.deleted=1;
UPDATE players SET hp=hp-NEW.dmg WHERE wolf=1 AND NEW.x>=x AND NEW.x<=x+@unit_size AND NEW.y>=y AND NEW.y<=y+@unit_size;
END IF;
END;//
DELIMITER ;
在上面,我做了一个select,它给出了碰撞的行数。然后在下面我做同样的查询,因为我想更新那些相同的行。我本来可以完成更新,但如果至少有一行受到影响,我只想做SET NEW.deleted=1;
。如果我只保留更新声明,我不知道该怎么做。
有没有人知道这样做的击球方式?
由于
答案 0 :(得分:0)
如果要根据NEW.deleted
上受影响的行数设置update
值,则可以使用ROW_COUNT()
检查受影响的行数。
示例:
DELIMITER //
CREATE TRIGGER checkcollision2 BEFORE UPDATE ON projectiles
FOR EACH ROW
BEGIN
SET custom_unit_size := 25;
UPDATE players
SET hp = hp - NEW.dmg
WHERE wolf = 1
AND NEW.x >= x
AND NEW.x <= x + custom_unit_size
AND NEW.y >= y
AND NEW.y <= y + custom_unit_size;
IF ROW_COUNT() > 0 THEN
SET NEW.deleted = 1;
END IF;
END;
//
DELIMITER ;
请参阅: