MySQL插入或替换

时间:2013-11-23 18:48:38

标签: php mysql sql database upsert

我想创建一个系统来跟踪游戏中玩家的进度。每个玩家都可以是多个组的成员,这些组都有其他要求。为了跟踪他的进度,一旦他加入一个小组,玩家的统计数据将被保存。每当他重新加载他的统计数据时,当前的数据应保存在数据库中。

播放器的所有统计信息都以json格式存储,然后由PHP或JS解析。一旦玩家加入一个组,就会设置一个比较= 0的条目。当玩家第一次点击更新统计数据时,应该创建一个比较= 1的条目,从那时起它应该只更新,而不是新创建的。

现在我的问题是:如何实现这一目标?在阅读INSERT INTO的语法时,我得到了以下内容:

INSERT INTO `groups` (`grp`, `id`, `json`, `compare`) VALUES 
($grp, $id, $json, 1) ON DUPLICATE KEY SET `json` = $json

但是,由于没有密钥集,我不知道是否可以设置两个/三个密钥(因为每个用户可以有多个组,以及同一组中的compare = 0条目) ,我认为我不能这样做。

+------+----+---------+---------+
| grp  | id | json    | compare |
+------+----+---------+---------+
|  1   |  1 |  stats  |    0    |
|  1   |  1 |  stats  |    1    |
|  1   |  2 |  stats  |    0    |
|  1   |  2 |  stats  |    1    |
|  2   |  2 |  stats  |    0    |
|  2   |  3 |  stats  |    0    |
|  2   |  3 |  stats  |    1    |
|  2   |  4 |  stats  |    0    |
|  2   |  5 |  stats  |    0    |
+------+----+---------+---------+

grp是玩家的群组。没有真正的限制     玩家可以加入的团体数量。

id是播放器的ID。

json包含json中玩家的统计数据     格式(点数等)。

compare是一个布尔值。 0代表进入统计数据(球员的得分数) 当他注册时已经有了)并且1代表当前的统计数据 - 这将是 与入门统计数据进行比较,以获得差异(=点数a 自加入该组以来的球员。)

我希望我的解释是可以理解的,有人可以帮助我。

2 个答案:

答案 0 :(得分:2)

您可以使用insert raplace:

REPLACE INTO groups (`grp`, `id`, `json`, `compare`) VALUES (...);

但是你必须在表格中拥有主键。替换为自动查找主键,如果存在记录,则更新行,但如果不存在,则添加新行。

答案 1 :(得分:1)

您可以创建包含多个列的唯一键。这将触发'on duplicate'条款。

ALTER TABLE groups
ADD UNIQUE (grp, id, compare)