【发布时间】:2021-02-07 14:21:32
【问题描述】:
我正在处理一个项目,但目前遇到了一个问题。我有一个记录玩家访问数据的表。每个玩家都有自己唯一的 id 和他们访问过的地方的名称,包括访问日期和次数。
示例行:
TestUser Server12 2020-10-25 12:00:00 25
现在速度是这个问题的一部分,因为我需要它相对快速,因为我正在对多达 70 名玩家进行比较。我认为批量查询会更可取,因为它会显着减少执行时间,但是,问题是如何检查特定对(user and server) 的表中是否存在该行,如果不插入新行,如果是,则使用访问计数增量后的当前日期值更新当前现有行(+1)
我知道INSERT ON DUPLICATE KEY,但这不起作用,因为它使用主键来查找行,并且我使用带有服务器名称的玩家唯一 ID。
所以我的问题是,是否有任何方法可以执行一个查询,如果该行不存在,它会执行插入操作,或者使用这两个指定的列更新现有行。
我之前的解决方案:
选择语句检查是否存在:
$"SELECT Count(*) FROM `visited` WHERE playerid='{playerID}' AND server_name='{serverName}'"
然后根据选择结果执行以下操作之一: 插入:
INSERT INTO visited (playerid, server_name, visit_count, last_visit_date) " +
$"VALUES ('{playerID}', '{v}', IFNULL(visit_count,0)+1, '{DateTime.Now:MM/dd/yyyy hh:mm:ss tt}')
更新:
UPDATE visited SET visit_count=IFNULL(visit_count,0)+1, last_visit_date='{DateTime.Now:MM/dd/yyyy hh:mm:ss}' WHERE playerid='{playerID}' AND server_name='{v}'
旧的解决方案真的很慢,特别是如果我按玩家要求做的话。
【问题讨论】:
-
查看
UPSERT。本质上是INSERT和UPDATE的组合。 -
我会再次尝试替换,但是,INSERT ON DUPLICATE KEY 和 INSERT IGNORE 并不能解决问题。编辑:替换将无法正常工作,因为它需要一个主键。正如帖子中提到的,我的目标是使用一对唯一的 PlayerId 结合 ServerName。
-
“我知道 INSERT ON DUPLICATE KEY,但这不起作用,因为它使用主键来查找行,并且我使用带有服务器名称的玩家唯一 ID。” i> 您是否真的尝试过,或者您只是假设它只适用于主键?因为它适用于每个唯一键。所以试试看吧。
-
嗯,我试过了,它使用了自增主键。据我所知,
ON DUPLICATE KEY没有 WHERE 子句,我可以在其中提供两对列作为比较
标签: c# mysql sql sql-update sql-insert