如果存在多个特定的一个,则更新,否则插入

时间:2016-05-11 08:33:59

标签: php mysql

我已阅读了几十篇关于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,或者我是否需要获取特定字段并使用条件?如果可能,我不愿意。

1 个答案:

答案 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变量直接放在请求中。