如何使MySQL中的一个字段根据另一个字段自动更新


How do I make a field in MySQL automatically update depending on another field?

我正在创建一个PHP/MySQL星球大战浏览器游戏,以获得乐趣。我有一个经验(xp)领域。我还有一个等级字段。我希望它是这样的-根据经验领域的经验值,等级领域也会改变。所以,如果我有0到300 xp,等级字段将是绝地入门。如果我有300到700 xp,等级字段将是Padawan。如果我有700到1000,等级领域将是绝地武士。我希望它能自动更新。这可能吗?

我建议采用不同的方法。

创建第二个表来管理排名,类似于以下内容:

id |    xp  | rank
---+--------+--------------
 1 |      0 | Initiate 
 2 |    300 | Padawan
 3 |    700 | Jedi Knight

然后,您可以在SQL查询中引用xp上需要排名的地方,类似于以下内容:

SELECT P.*, R.*
FROM players P 
LEFT JOIN ranks R ON P.`player_xp` <= R.`xp` 
GROUP BY P.`player_xp`;

这只是一个如何解决这个问题的粗略例子,也许它需要一些微调。但有了这种方法,你将对标题有更多的控制权。作为副作用,您也可以避免表中有大量重复的数据。

不,触发器是个糟糕的选择。

它会有点像

CREATE TRIGGER updateRank AFTER UPDATE ON yourTable...

所以它会在你每次更新你的表时运行,无论你是更新你的播放器的xp还是其他什么。

编写一个存储过程,用它更新玩家的xp,同时检查排名是否仍然正确或需要更新到。

或者,您甚至不需要存储过程。这没有经过测试,但也可以工作:

   UPDATE yourTable SET 
   xp = $theXPthePlayerEarnedWhilePlaying,
   rank = 
   CASE WHEN $theXPthePlayerEarnedWhilePlaying BETWEEN 0 AND 299 THEN 'Jedi Initiate'
   WHEN $theXPthePlayerEarnedWhilePlaying BETWEEN 300 AND 699 THEN 'Padawan'
   /*...*/
   ELSE 'unranked Player'
   END 
   WHERE playerId = $yourPlayer;

编辑:如果你想了解更多,这是一个很好的存储过程教程。不要害怕,没那么多,也不太难弄清楚。http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx

否!MySQL无法为您做到这一点。但你可以告诉MySQL一次,它会从那里开始处理它。

我说的是触发因素。你需要创建一个触发器(除非你想在php代码中处理它)当经验改变时mysql应该做什么

阅读手册中关于创建触发器的信息

尝试使用触发器。