我打算在MariaDB中为学生的成绩处理一张桌子。当学生发送新成绩时,我需要首先检查表中是否存在学生记录,如果是,则更新新成绩是否高于现有成绩。如果表中不存在学生,请插入新记录。
以下是我的PHP代码(为简单起见,假设学生姓名是John,他的新成绩是100,$conn
是mysqli
对象):
$result = $conn->query("select name, grade from grade_sheet where name='john' and grade<100");
if ($result->num_rows > 0) {
$conn->query("update grade_sheet set grade=100 where name='john'");
} else {
$conn->query("insert into grade_sheet (name, grade) values ('john', 100)");
}
是否可以简化代码?更具体地说,是否可以使用类似insert ... on duplicate key update
?
此处name
是主键。在最坏的情况下,上述代码需要搜索两次表吗?
答案 0 :(得分:1)
与评论中提到的相反,这是错误的做法,你想改变它是正确的。您应该更改它的原因是为了避免竞争条件,另一个线程可能会修改您的两个查询之间感兴趣的记录。
如果你有一个合适的索引,那么性能不会有太大差别,但如果你正在进行这种查询,你可能不会。您应该在此表上使用自动增量主键,并使用该列而不是“John”来引用它,这不太可能是唯一的。然后应该有一个记录学生姓名的学生表的外键
然后,您可以使用INSERT ... ON DUPLICATE KEY UPDATE在单个查询中完成工作。安全。