$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.
我该如何解决这个问题?
答案 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,这表示未插入任何行。