我已阅读了几十篇关于ON DUPLICATE KEY UPDATE的帖子,但到目前为止,这些帖子都没有涵盖我的具体用例。这是我目前的简单代码:
public async Task<string> ExecuteGetHttp(string url, Dictionary<string, string> headers = null)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
if (headers != null)
{
foreach (var header in headers)
{
client.DefaultRequestHeaders.Add(header.Key, header.Value);
}
}
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
我有另一个脚本监视用户的“最高分”并将其与“当前分数”进行比较。如果“当前得分”高于“最高得分”,则会触发上述代码。
默认情况下,用户的详细信息随后会插入到数据库中(因为它可能尚不存在)。但是如果已经存在具有该“名称”的条目,我想仅更新“得分”和“得分2”(“id”和“名称”应保持不变)。请注意,我需要在此处专门检查“名称”副本,因为如果“得分”或“得分2”与现有条目相同则无关紧要。
这是否可以使用ON DUPLICATE KEY UPDATE,或者我是否需要获取特定字段并使用条件?如果可能,我不愿意。
答案 0 :(得分:2)
如果在name
列上添加UNIQUE索引,它应该有效:
ALTER TABLE `scores` ADD UNIQUE `name_unique` (`name`);
无需插入NULL ID,或更新名称列:
$query = "INSERT INTO $DatabaseName .`scores` (`name`,`score`,`score2`)
VALUES ('$name', '$score', '$score2')
ON DUPLICATE KEY UPDATE score='$score', score2='$score2'";
而且,您应该使用预准备语句,而不是将php变量直接放在请求中。