MySQL Update如果存在值,如果不是PHP则插入?

时间:2014-06-20 22:01:56

标签: php mysql

$sql_career = "REPLACE INTO career
         (id, battletag, lastHeroPlayed, lastUpdated, monsters, elites, hardcoreMonsters, barbarian, crusader, demonhunter, monk, witchdoctor, wizard, paragonLevel, paragonLevelHardcore)
         VALUES
         ('', '$battletag', '$lastHeroPlayed', '$lastUpdated', '$monsters', '$elites', '$hardcoreMonsters', '$barbarian', '$crusader', '$demonhunter', '$monk', '$witchdoctor', '$wizard', '$paragonLevel', '$paragonLevelHardcore')";

ID自动增量。 battletag是唯一的。

其他一切都会随着时间的推移而改变。因此,如果battletag已经存在而没有创建新的id,我想要替换或更新条目。如果它不存在,我希望它创建一个新条目,让id自动增加该唯一battletag


这有一个问题:

 $sql_career = "
    insert INTO career
      (id, battletag, lastHeroPlayed)
    VALUES
      (NULL, '$battletag', $lastHeroPlayed)
    on duplicate key
      update lastHeroPlayed=$lastHeroPlayed;
 ";

例如,如果我加载两个唯一的行,则ID auto会自动增加到1,然后再增加2。然后,如果我加载一个具有其中一个现有行的唯一键的副本的行(然后它应该更新),这实际上会触发自动增量。因此,如果我再添加第三个唯一行,则其数字将为4而不是3.

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

您想使用on duplicate key ... update syntax而不是替换为。

定义一个唯一列(主索引或唯一索引),然后在语句中检查它,如下所示:

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

使用它而不是替换的好处是,替换为将始终删除已经存在的数据,并将其替换为第二次提供的数据(与命令名称相似)。但是,update on...语句只会更新您在其第二部分中定义的列 - 如果找到重复项 - 那么您可以将信息保留在要保留的列中。

基本上你的命令看起来像这样(仅限重要列的缩写)

$sql_career = "
    insert INTO career
        (id, battletag, heroesKilled)
    VALUES
        ($id, '$battletag', $heroesKilled)
    on duplicate key
        update heroesKilled=heroesKilled+1;

";

再次请记住,在您的表格中,您需要在battletag上强制使用一个唯一的列 - primary key or unique index。您可以通过代码或通过phpMyAdmin之类的方式执行此操作(如果已安装)。

编辑:好的,我可能会发现一个little gem(大约是页面下方的三分之一)可以做到这一点 - 但我自己从未使用过,但是你可以尝试以下方法吗? / p>

$sql_career = "
    insert ignore INTO career
        (id, battletag, heroesKilled)
    VALUES
        (null, '$battletag', $heroesKilled)
    on duplicate key
        update heroesKilled=heroesKilled+1;

";

this page of the docs中似乎也有合作证据支持这一点:

  

如果使用INSERT IGNORE并忽略该行,则AUTO_INCREMENT计数器不会递增,LAST_INSERT_ID()将返回0,这表示未插入任何行。